装饰者模式

目录

问题:

定义:

举例:

拓展:


问题:

今天刷面经,发现自己不理解装饰者模式,特此记录。

最好了解一下 委托者模式

定义:


不改变原有类的情况下,添加额外的功能,也就说“点缀”,就像冰淇淋上面撒一些巧克力或者曲奇一样。主要口味还是那个口味,但会多一些其他的口感。

举例:


现在的问题是我 “添加” 和“修改”都会改变SimpleCoffee这个类,违反了单一职责原则。

public class SimpleCoffee {

    
    public String getDescription() {
        return "Simple Coffee";
    }

   
    public double cost() {
        return 10.0;
    }
    
    public Double addMilk(){
        System.out.println("加入牛奶");
        return  3.0;    
    
    }

    public Double addSugar(){
        System.out.println("加入糖");
        return  4.0;

    }
}

用装饰者模式修改:

也就说我把“点缀”这个功能委托了给了CoffeeDecorator,

这样我的SimpleCoffee这个类只有修改的时候才会改动,

添加的时候,都会CoffeeDecorator帮我完成

public interface Coffee {
    String getDescription();
    double cost();
}

public  abstract class CoffeeDecorator implements Coffee{
    //为什么这里不用private 因为 子类会调用coffee,
    //用了private子类调用coffee就必须用getter方法
    protected Coffee coffee;

    public CoffeeDecorator(Coffee coffee){
        this.coffee = coffee;
    }
    @Override
    public String getDescription() {
        return coffee.getDescription();
    }

    @Override
    public double cost() {
        return coffee.cost();
    }
}

public class SimpleCoffee implements Coffee{
    @Override
    public String getDescription() {
        return "Simple Coffee";
    }

    @Override
    public double cost() {
        return 10.0;
    }
}


public class Milk extends CoffeeDecorator{
    public Milk(Coffee coffee) {
        super(coffee);
    }

    public String getDescription(){
        return super.getDescription()+",Milk";
    }

    public double cost(){
        return super.cost()+3.0;
    }

}


public class Sugar extends CoffeeDecorator{

    public Sugar(Coffee coffee) {
        super(coffee);
    }

    public String getDescription(){
        return super.getDescription()+",Sugar";
    }

    public double cost(){
        return super.cost()+4.0;
    }
}

//测试
public class Main {
    public static void main(String[] args) {

       Coffee simpleCoffee = new SimpleCoffee();

        simpleCoffee = new Milk(simpleCoffee);
        simpleCoffee = new Sugar(simpleCoffee);
        System.out.println(simpleCoffee.getDescription()+simpleCoffee.cost());

    }
}

拓展:

这是运行时候的函数进栈情况,我们可以看出来,每次加糖和牛奶都会调用CoffeeDecorator,

CoffeeDecorator 就是跟SimpleCoffee的Cost()连接的桥梁,这也告诉了我们装饰者模式到底是如何再不改变原有类的基础上加“点缀”。

//点缀
public  abstract class CoffeeDecorator implements Coffee{
    //为什么这里不用private 因为 子类会调用coffee,
    //用了private子类调用coffee就必须用getter方法
    protected Coffee coffee;

    public CoffeeDecorator(Coffee coffee){
        this.coffee = coffee;
    }
    @Override
    public String getDescription() {
        return coffee.getDescription();
    }

    @Override
    public double cost() {
        return coffee.cost();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值