设计模式--装饰者模式

1、前言

本文主要讲述装饰者模式,文中使用通俗易懂的案例

2、什么是装饰者模式

装饰者模式是23种设计模式中结构型模式的一种,它的核心思想是在不必改变类文件及不使用继承的情况下,通过装饰者包裹目标对象,动态地扩展目标对象的功能。

3、生活中的装饰者器模式

钢铁侠

托尼斯塔克,漫威著名的超级英雄钢铁侠,也是斯塔克工业的拥有者,还是著名的富豪和花花公子。问每个男人想成为漫威的哪个超级英雄,十个有九个会说想成为钢铁侠,剩下的那个可能是想成为绿巨人。

钢铁侠最出名的就是他的钢铁战衣,而只有穿戴上钢铁战衣的托尼斯塔克才是钢铁侠,通过钢铁战衣让自己成为钢铁侠,做到一些普通人完成不了的事。这样的钢铁侠就跟设计模式中的装饰者模式类似。

代码实现

/**
 * 抽象组件
 */
public  interface Human {
    //行为方法
    void behavior();
}
/**
 * 具体组件类
 */
public class TonyStark implements Human{

    @Override
    public void behavior() {
        System.out.println("运用科技和财富拯救世界");
    }
}
/**
 * 装饰者
 */
public class Superhero implements Human{

    private final Human human;

    //获取被装饰对象
    public Superhero(Human human) {
        this.human = human;
    }

    @Override
    public void behavior() {
        //执行目标对象原本的行为
        human.behavior();
    }

}
/**
 * 具体装饰者类
 */
public class IronMan extends Superhero{

    public IronMan(Human human) {
        super(human);
    }

    //增强目标对象的行为
    @Override
    public void behavior() {
        super.behavior();
        System.out.println("穿戴钢铁战衣拯救世界");
    }

}
public class main {

    public static void main(String[] args) {

        TonyStark tonyStark = new TonyStark();

        IronMan ironMan = new IronMan(tonyStark);

        ironMan.behavior();
    }
}

结果:

运用科技和财富拯救世界
穿戴钢铁战衣拯救世界

奶茶叫料应用

/**
 * 奶茶接口
 */
public  interface Beverage {
    int cost();
}
/**
 * 奶茶具体实现
 */
public class MilkTea implements Beverage {

    @Override
    public int cost() {
        int price = 10;
        System.out.println("奶茶价格是:" + price);
        return price;
    }
}
/**
 * 加料装饰者
 */
public  class Topping implements Beverage {

    Beverage beverage;

    //装饰对象
    public Topping(Beverage beverage) {
        this.beverage = beverage;
    }

    @Override
    public int cost() {
        int cost = beverage.cost();
        System.out.println("饮料价格:" + cost);
        return  cost;
    }
}
/**
 * 加料装饰者具体实现
 */
public  class Pudding extends Topping {


    public Pudding(Beverage beverage) {
        super(beverage);
    }

    @Override
    public int cost() {
        int bgCost = super.cost();
        int pudPrice = 2;
        System.out.println("布丁加料价格: " + pudPrice);
        return bgCost+pudPrice;
    }

}
public class main {
    public static void main(String[] args) {
        MilkTea milkTea = new MilkTea();
        Pudding pudding = new Pudding(milkTea);
        int cost = pudding.cost();
        System.out.println("总价格:" + cost);
    }
}

结果

奶茶价格是:10
饮料价格:10
布丁加料价格: 2
总价格:12

总结

就是传入原本对象到装饰实现者身上,在装饰实现者身上实现具体操作,最终实现增强原来实现的结果

 

posted @ 2023-06-08 11:13  jason饼干大怪兽  阅读(42)  评论(0)    收藏  举报