装饰模式
来源:互联网 发布:微盘软件 编辑:程序博客网 时间:2024/05/09 21:47
装饰模式
动态地给一个对象添加一些额外的职责。即为已有功能动态地添加更多功能的一种方式。
当一个对象所需的功能是动态变化,或者说是有着许多种组合(且可以有着一定的组合顺序)时,这时如果使用子类的方式则需要将这种组合的过程暴露在外面,且使得核心类的代码变得复杂。而使用装饰模式的话,它吧每个要装饰的功能放在单独的类中,然后让这个类去包装其所要装饰的对象。如此这般,客户代码就可以根据需要有选择、有顺序地使用装饰功能包装对象了。
所需的类:
- Component 对象接口类,有具体对象类的话也可以不用此接口
- ConcreteComponent 具体对象类(核心功能类)
- Decorator 装饰抽象类继承了对象接口类或者具体对象类
- ConcreteDecoratorA 具体的装饰类
代码实现:
Component(可以没有)
public abstract class Component { public abstract void Operation();}
ConcreteComponent(具体对象类)
public class ConcreteComponent extends Component{ @Override public void Operation() { // TODO Auto-generated method stub //进行具体对象的核心功能操作 } }
Decorator(装饰抽象类)
/** * 如果只有ConcreteComponent则无需继承Component * 直接继承自具体的ConcreteComponent类即可 */public abstract class Decorator extends Component{ protected Component component; //利用此方法对对象进行包装 public void setComponent(Component component){ //设置Component this.component = component; } @Override public void Operation() { // TODO Auto-generated method stub if(component!=null){ component.Operation(); } } /** 这个方法供子类使用 */ public abstract void subOperation();}
ConcreteDecoratorA(具体的装饰类)
public class ConcreteDecoratorA extends Decorator{ private String _string; public void Operation() { // TODO Auto-generated method stub super.Operation(); //调用父类方法必须放在第一行 this._string = "独有功能"; System.out.println("ConcreteDecoratorA装饰对象A的操作"); }}
Aplication
public class Application { public static void main(String args[]){ /** * 将装饰功能区与核心类分开了 */ ConcreteComponent c = new ConcreteComponent();//核心功能类 ConcreteDecoratorA a = new ConcreteDecoratorA(); ConcreteDecoratorB b = new ConcreteDecoratorB();//装饰类 a.setComponent(c);//包装 b.setComponent(a); b.subOperation(); /** 注意:执行是有顺序的 */ }}
从代码中可以看出,装饰模式是利用setComponent方法来对对象进行包装的,如果没有Component只有一个ConcreteComponent的话则Decorator可以是ConcreteComponent的一个子类。
0 0
- 装饰模式-撤销装饰
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- UVA10341二分解方程
- memset中sizeof(动态分配的数组)的问题
- 教我,怎敢“忘八端”
- 第五届蓝桥杯
- Android菜鸟的成长笔记——PopupMenu使用
- 装饰模式
- 指向类成员函数指针之指针数组
- 前端精选文摘:BFC 神奇背后的原理
- web.xml配置信息
- HandlerThread 使用及其源码完全解析
- HDU 5635:LCP Array
- 一起看代码来玩玩QT之18 database (last QSqlQueryModel 对数据库进行操作(只查不能改)QTableModel 可改,但是QSqlQueryModel也可以添加代理等功)
- Android中MVP设计使用
- 程序员必备算法-最考验逻辑思维能力的十大基础算法