《设计模式》之装饰器模式

mac2025-07-31  4

装饰器模式

装饰器模式中主要有两个角色:

装饰器(夹克,帽子) 被装饰的对象(老王)

装饰器和被装饰的对象有两个特点,也是装饰器模式的关键:

他们实现同一个接口 装饰器中使用了被装饰的对象

使用:

/** * <p> *定义一个接口 * </p> * * @author aodeng-低调小熊猫 * @since 19-7-11 */ public interface Person { /** * 计算累计消费 * @return */ public Double cost(); /** * 输出信息 */ public void show(); }

/** * <p> *老王( 被装饰的对象 )实现定义的接口 * </p> * * @author aodeng-低调小熊猫 * @since 19-7-11 */ public class LaoWang implements Person{ @Override public Double cost() { //没消费,消费为0 return 0.0; } @Override public void show() { System.out.println("老王我现在消费" this.cost()); } }

/** * <p> *装饰器超类,和被装饰的对象实现同一个接口 Person : * </p> * * @author aodeng-低调小熊猫 * @since 19-7-11 */ public abstract class ClothesDecorator implements Person{ /** * 装饰器中要使用被装饰器的对象,构造方法中传入 */ protected Person person; public ClothesDecorator(Person person){ this.person=person; } }

/** * <p> *具体的装饰,夹克 * </p> * * @author aodeng-低调小熊猫 * @since 19-7-11 */ public class Jacket extends ClothesDecorator{ public Jacket(Person person){ /** * super 指向自己超(父)类 */ super(person); } @Override public Double cost() { //消费一件夹克 return person.cost() 100; } @Override public void show() { person.show(); System.out.println("老王我现在又消费了一件夹克100,累计用了" this.cost()); } }

/** * <p> *具体的装饰,帽子 * </p> * * @author aodeng-低调小熊猫 * @since 19-7-11 */ public class Hat extends ClothesDecorator{ public Hat(Person person){ //指向自己超(父)类 super(person); } @Override public Double cost() { return person.cost() 200; } @Override public void show() { person.show(); System.out.println("老王我现在又消费了一件帽子200,累计用了" this.cost()); } }

测试

/** * <p> *程序入口 * </p> * * @author aodeng-低调小熊猫 * @since 19-7-11 */ public class LearnMain { public static void main(String[] args) { //创建一个老王 Person laoWang=new LaoWang(); //老王买了一件夹克 laoWang=new Jacket(laoWang); //老王买了一个帽子 laoWang=new Hat(laoWang); laoWang.show(); /* 控制台输出: 老王我现在消费0.0 老王我现在又消费了一件夹克100,累计用了100.0 老王我现在又消费了一件帽子200,累计用了300.0*/ } }

源码

源码地址:https://github.com/java-aodeng/hope

Links:

CI/CD 流程以及原理说明 Github 熊猫哥星球基地 欢迎关注公众号【低调小熊猫】

本文由低调小熊猫一文多发操作发布! 欢迎关注公众号:低调小熊猫

最新回复(0)