装饰模式
- 将需要的功能按照正确的顺序串联起来进行控制。
1.定义
动态的给对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
- 是为已经存在的功能再动态添加更多功能的一种方式。

2.应用场合
应用在系统需要新的功能的时候。
- 传统的方式是在原有的类中添加功能代码,装饰原有类的核心职责。但是会增加类的复杂度。对于那些仅在特殊场合用的功能,这种方式就显得比较笨重。
- 装饰模式提供了一种更好的解决方式,将装饰功能作为一个单独的类,并且让这个类去包装他要装饰的类。此时,我们就可以在不同的场合,按照需要按照某种特定的顺序使用具有装饰功能的类来装饰我们的对象。
- 简而言之,把类中的装饰功能,从类中搬出去,从而实现简化原有的类。有效的把类的核心职责与装饰功能区分离,并且可以去除相关类中重复的装饰逻辑。
- 装饰顺序很重要,要保证装饰类之间的相互独立。
3.代码
3.1要装饰的对象接口,一个抽象类
package clt.decorator.ordinary;
//对象接口,可以为这些类动态添加职责
public abstract class Component {
public abstract void Operation();
}
3.2要具体进行装饰的对象,继承上边的对象接口
package clt.decorator.ordinary;
//具体要装饰的对象
public class ConcreteComponent extends Component {
@Override
public vaoid Operation() {
System.out.println("这是具体要装饰的对象");
}
}
3.3定义一个装饰父类,继承上边的对象接口
package clt.decorator.ordinary;
public class Decorator extends Component{
protected Component component;
public void setComponent(Component component) {
this.component = component;
}
@Override
public void Operation() {
if(component!=null){
//有具体的要装饰的对象,执行要装饰对象的核心职责
component.Operation();
}
}
}
3.4一个具体的装饰类A,继承上边的装饰类
package clt.decorator.ordinary;
//具体要装饰的对象
public class ConcreteComponent extends Component {
@Override
public void Operation() {
System.out.println("这是具体要装饰的对象");
}
}
3.5一个具体的装饰类B,继承上边的装饰类
package clt.decorator.ordinary;
public class ConcreteDecoratorB extends Decorator{
private String addstateB; //本类独有的功能,用于装饰对象
@Override
public void Operation() {
super.Operation(); //首先运行核心职责
addstateB="装饰类B给对象添加装饰"; //再执行要装饰的功能
System.out.println("装饰类B给具体对象进行了进行了装饰");
}
}
3.6客户端测试
package clt.decorator.ordinary;
public class Client {
public static void main(String[] args) {
//声明对象
ConcreteComponent cc=new ConcreteComponent(); //具体要装饰的对象
ConcreteDeractorA da=new ConcreteDeractorA(); //装饰类A
ConcreteDecoratorB db=new ConcreteDecoratorB(); //装饰类B
//开始装饰 先用da装饰cc,再用db在最外层装饰da
da.setComponent(cc);
db.setComponent(da);
db.Operation();
}
}
3.7运行结果
这是具体要装饰的对象
装饰类A给具体对象进行了进行了装饰
装饰类B给具体对象进行了进行了装饰
530

被折叠的 条评论
为什么被折叠?



