我們經常有對圖片進行處理的需求。本文就從最簡單的要求到比較復雜的要求描述面向對象的抽象方式
下面假設調用方按照以下的協議進行調用:
ImageManager -src image_src_path -resize 100x200 -rorate 90 -...
-src表示來源圖片
-resize 表示縮放
....
需求1:對圖片進行縮放后存到指定的位置
解決方法:
很簡單,只需要兩個功能:縮放和存儲圖片的功能
代碼1:
public void processImage(String imageSrc,int newWidth, int newHeight,String imageDest){
MyImage image = ... //讀取來源圖片
MyImage newImg = resize(image,newWidth,newHeight);
saveImage(newImage,imageDest);
//剩下的是釋放資源的操作
}
private MyImage resize(MyImage image, int newWidth, int newHeigth){
//縮放的代碼
}
private void saveImage(MyImage image, String destpath){
//存儲的代碼
}
需求2:對圖片按照固定的順序(縮放、旋轉、剪切、銳化等,即命令行中resize 必須在 rorate之前)處理后保存新的圖片
解決方法:
依然簡單,按照代碼1的邏輯添加新處理圖片的方法即可
代碼:
public void processImage(ImageInfo info){// 這里的info存放的是操作所需要的信息,比如旋轉的角度等
MyImage image = ... //讀取來源圖片
MyImage newImg = resize(image,newWidth,newHeight);// 縮放
newImg = rorate(...);//旋轉
newImg = cut(...);//剪切
newImg = sharpend(...)//銳化
//釋放資源
}
需求3: 根據調用放輸入命令的前后順序對圖片進行處理.
比如,輸入-resize 100x200 -rorate 90 :縮放-> 旋轉
輸入-rorate 90 -resize 100x200 -cut 200x200 :旋轉->縮放->剪切
解決方法:
最直接的方法: 先獲取操作的前后順序,然后if-else搞定
代碼3.1:
public void processImage(ImageInfo info){// 這里的info存放的是操作所需要的信息,比如旋轉的角度等
MyImage image = ... //讀取來源圖片
List<String> operateList = ...// 獲取操作的先后順序,放在數組中
for(String op : operateList){
image = process(op, ...);
}
//釋放資源
}
public MyImage process(String op, ...){
if(縮放){
return resize(。。。)
}
if(旋轉){
return rorate(..);
}
...
}
需求4:在需求3的基礎上另外再加上10個操作。
解決方法4.1 :
在 public MyImage process(String op, ...)中添加新的if-else進行處理。
優點:很直觀,很容易理解。
缺點:1:if太多
2:process方法過長
3:每添加一個一個新的操作就要修改原來的邏輯代碼process(),這是非常危險的
解決方法4.2:
將對圖片的操作抽象為一個接口:
interface ImageOperation{
operate(ImageInfo info);
}
class RorateOperation implements ImageOperation{
...
}
...
static{
map.put("rorate",new RorateOperation());
...
}
public void processImage(ImageInfo info){// 這里的info存放的是操作所需要的信息,比如旋轉的角度等
MyImage image = ... //讀取來源圖片
List<String> operateList = ...// 獲取操作的先后順序,放在數組中
for(String op : operateList){
Operator p = getOperator(op);
p.operate(p);
}
//釋放資源
}
public ImageOperation getOperator(String op){
return map.get(op);
}
好處:避免了過長的process();邏輯特別清晰;極大程度上支持開-閉原則
缺點:將會創造比較多操作類,換來的好處就是每個類(算法)都特別精煉。
posted on 2010-09-14 15:26
南國咖啡 閱讀(105)
評論(0) 編輯 收藏