欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

装饰者模式,代码实现类图

程序员文章站 2022-03-26 17:40:53
装饰者模式定义:在不改变原有对象的基础上,将功能附加到对象上提供了比继承更有弹性的替代方案(扩展原有对象功能)类型:结构型模式适用场景:扩展一个类的功能或给一个类添加附加职责,动态的给一个对象添加功能,这些功能可以再动态的撤销。优点:继承的有利补充,比继承灵活,不改变原有对象的情况下给一个对象扩展功能。通过使用不同装饰类以及这些装饰类的排列组合,可以实现不同效果符合开闭原则缺点:会出现更多的代码,更多的类,增加程序复杂性。动态装饰时,多层装饰时会更复杂。装饰者VS代理模式装饰...

装饰者模式

定义:

在不改变原有对象的基础上,将功能附加到对象上

提供了比继承更有弹性的替代方案(扩展原有对象功能)

类型:

结构型模式

适用场景:

扩展一个类的功能或给一个类添加附加职责,动态的给一个对象添加功能,这些功能可以再动态的撤销。

优点:

继承的有利补充,比继承灵活,不改变原有对象的情况下给一个对象扩展功能。

通过使用不同装饰类以及这些装饰类的排列组合,可以实现不同效果

符合开闭原则

缺点:

会出现更多的代码,更多的类,增加程序复杂性。

动态装饰时,多层装饰时会更复杂。

装饰者VS代理模式

装饰者关注于对象上动态的添加对象方法,代理模式关注于控制对对象的访问。代理模式在代理类中创建一个对象实例,装饰者模式则原始对象作为一个参数,传给装饰者的构造器。

装饰者模式VS适配器模式

装饰者模式和适配器模式都是包装模式,适配器和被适配的类接口一般不同。

代码

//抽象的被装饰者ABattercake
public abstract class ABattercake {
    public abstract String getDesc();
    public abstract int cost();
}

//被装饰者实现类Battercake

public class Battercake extends ABattercake {
    public String getDesc(){
        return "煎饼";
    }
    public int cost(){
        return 8;
    }
}

//抽象的装饰者AbstractDecorator
public abstract class AbstractDecorator extends ABattercake{
    private ABattercake aBattercake;
    //持有被装饰者
   public AbstractDecorator(ABattercake aBattercake){
        this.aBattercake=aBattercake;
    }
    protected  abstract void doSomething();
    @Override
    public String getDesc() {
        return aBattercake.getDesc();
    }

    @Override
    public int cost() {
        return aBattercake.cost();
    }
}

//装饰者1Egg
public class EggDecorator extends AbstractDecorator{
    public EggDecorator(ABattercake aBattercake) {
        super(aBattercake);
    }

    @Override
    protected void doSomething() {

    }

    @Override
    public String getDesc() {
        return super.getDesc()+"加????";
    }

    @Override
    public int cost() {
        return super.cost()+1;
    }
}

//装饰者2Sausage
public class SausageDecorator extends AbstractDecorator{
    public SausageDecorator(ABattercake aBattercake) {
        super(aBattercake);
    }

    @Override
    protected void doSomething() {

    }

    @Override
    public String getDesc() {
        return super.getDesc()+"加香肠????";
    }

    @Override
    public int cost() {
        return super.cost()+2;
    }
}

//测试类
public class Test {
    public static void main(String[] args) {
        ABattercake aBattercake;
        aBattercake=new Battercake();
        aBattercake=new EggDecorator(aBattercake);
        aBattercake=new EggDecorator(aBattercake);
        aBattercake=new SausageDecorator(aBattercake);
        System.out.println(aBattercake.getDesc()+"价格"+aBattercake.cost());
    }
}


类图

装饰者模式,代码实现类图

本文地址:https://blog.csdn.net/jjy19971023/article/details/110287233