设计模式--装饰者模式
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
总结
就是传入原本对象到装饰实现者身上,在装饰实现者身上实现具体操作,最终实现增强原来实现的结果