设计模式三————装饰模式

装饰模式定义:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
装饰模式的初步理解:装饰是对某一个实体进行装饰,装饰的饰品根据装饰的对象不同而不同。对于同一个实体,装饰的顺序也有可能不同。因此就需要就实体而言进行装饰。而装饰品的功能都一样,就是用来修饰实体。因此,所有的装饰品可以继承同一个类;但是为了避免将这些实现类对象的引用放到实体类中(破坏开闭原则,添加新饰品和删除饰品都要修改实体类),将所有的装饰类对象串成一条链。实体类只管调用第一个饰品,后面的自动向下调用即可,直到结束。或者先调用饰品的方法,最后一个饰品调用实体的方法。
code…


实体和饰品统一个接口,这样的优点是暴露给客户端的就一个方法
public interface Component {
    public void operation();
}

装饰类的父类:

public class Decorator implements Component {
    private Component component;

    public Decorator(Component component) {
        this.component = component;//连接下一个饰品
    }
    public  void operation()
    {
        if(component!=null)
            component.operation();//调用下一个饰品的方法
    }
}

饰品类(有多个,但结构都类似):执行自己的和调用下一个之间的顺序可以根据需求进行调换。

public class DecorateA extends Decorator {
    public DecorateA(Component component) {
        super(component);
    }
    @Override public void operation() {
        super.operation();//先调用下一个的方法
        System.out.println("这是装饰品A");//执行自己的方法。
    }
}

实体类,也就是要被修饰的最后接到链中:

public class ConcreteOperation implements Component {
    @Override public void operation() {
        System.out.println("这里是主产品");
    }
}

main方法:

public class Main {
    public static void main(String[] args) {
        Component con=new ConcreteOperation();//实体
        Component da=new DecorateA(con);//装饰,挂链
        Component db=new DecorateB(da);
        Component dc=new DecorateC(db);
        dc.operation();
    }
}

执行的时候,先向下执行,直到实体的被执行,然后回溯到装饰,执行装饰。类似于逆向输出一个单向链表。


装饰着模式总结:在某些特定情况下增加实体类的功能时,如果不用装饰者模式,就需要对实体添加字段,修改代码。但是在大多数情况下增加的这些功能也许都不会用。因此,没有必要修改代码。将要装饰的功能单独放在类中,并让这个类包装它所要修饰的对象。再需要时进行动态添加就可以了。


上一篇
---The End---
下一篇
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值