当需要给某个对象而不是类本身添加一些功能的时候可以用到装饰模式。程序猿应该看代码比看文字说明更快。
1.类层次图
2.示例代码
- Component类。基类,抽象
public abstract class Component { public abstract void reSize(); public abstract void draw(); }
- TextView类
public class TextView extends Component { public void reSize(){}; public void draw() {}; }
- Decorator
public class Decorator extends Component { /** * 所修饰的对象 * */ private Component mBase; public Decorator() { } public Decorator(Component base){ this.mBase = base; } /** * 可以指定所修饰的对象 * */ public void attachComponent(Component base){ this.mBase = base; } /** * 接口透明,和父类一样 * */ public void reSize(){ if(mBase != null){ mBase.reSize(); } } /** * 接口透明,和父类一样 * */ public void draw() { if(mBase != null){ mBase.draw(); } } }
- BorderDecorator
public class BorderDecorator extends Decorator { private int width; public BorderDecorator(Component base,int width) { super(base); this.width = width; } /** * 设置宽度 * */ private void drawWidthBorder(int width){} /** * 接口透明,和父类一样 * */ public void reSize(){ drawBorder(width); super.reSize(); } /** * 接口透明,和父类一样 * */ public void draw() { drawBorder(width); super.draw(); } }
- ScrollDecorator
public class ScrollDecorator extends Decorator { public ScrollDecorator(Component base) { super(base); } private void scroll(){} /** * 接口透明,和父类一样 * */ public void reSize(){ scroll(); super.reSize(); } /** * 接口透明,和父类一样 * */ public void draw() { scroll(); super.draw(); } }
- 实现
Window mWindow = new Window(); TextView mTextView = new TextView(); mWindow.setComponet(new new BorderDecorator(new ScrollDecorator(mTextView),1));