装饰器模式中主要有两个角色:
装饰器和被装饰的对象有两个特点,也是装饰器模式的关键:
/** * <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
人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑,人工智能时代就要来临了,科幻电影中的场景将成为现实,未来已来! 详情: