模式4. 装饰模式-Java

装饰模式

  • 将需要的功能按照正确的顺序串联起来进行控制。

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给具体对象进行了进行了装饰
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值