装饰者模式

装饰者模式

装饰者模式(Decorator Pattern)是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式。


代码

上班要迟到了,正好遇到一个煎饼摊想买一个填填肚子。煎饼基础版要5块钱,加一个鸡蛋1块,一根火腿2块,总价是多少? 在这里不知道我能吃几个鸡蛋和火腿的情况下,应该怎样去实现?

  • UML类图
装饰器模式.png
  • 煎饼顶层抽象Pancake

    public abstract class Pancake {
        //套餐内容
        protected abstract String getMsg();
        //套餐价格
        protected abstract double getPrice();
    }
    
  • 基础套餐实现类 BasePancake

    public class BasePancake extends Pancake {
        @Override
        protected String getMsg() {
            return "一个煎饼";
        }
    
        @Override
        protected double getPrice() {
            return 5;
        }
    }
    
  • 装饰器类

    public class PancakeDecorator extends Pancake {
      //持有基础类的引用
        private  Pancake pancake;
    
        public PancakeDecorator(Pancake pancake){
            this.pancake = pancake;
        }
    
        @Override
        protected String getMsg() {
            return pancake.getMsg();
        }
    
        @Override
        protected double getPrice() {
            return pancake.getPrice();
        }
    }
    
  • 加一个鸡蛋

    public class PancakeWithEgg extends PancakeDecorator {
    
        public PancakeWithEgg(Pancake pancake) {
            super(pancake);
        }
    
        @Override
        protected String getMsg() {
            return super.getMsg()+"+1个鸡蛋,";
        }
    
        @Override
        protected double getPrice() {
            return super.getPrice()+1;
        }
    
    }
    
  • 加一根火腿

    public class PancakeWithHum extends PancakeDecorator {
    
        public PancakeWithHum(Pancake pancake) {
            super(pancake);
        }
    
        @Override
        protected String getMsg() {
            return super.getMsg()+"+1根火腿,";
        }
    
        @Override
        protected double getPrice() {
            return super.getPrice()+2;
        }
    
    }
    
  • 测试类

    public class PancakeDecoratorTest {
    
        public static void main(String[] args) {
          //先初始化基础套餐
            Pancake pancake = new BasePancake();
            pancake = new PancakeDecorator(pancake);
            System.out.println("我选择的套餐为:"+pancake.getMsg()+"\n 价格为:"+pancake.getPrice());
    
    
            System.out.println("===================================");
            //在基础套餐基础之上进行加餐
            pancake = new PancakeWithEgg(pancake);
            pancake = new PancakeWithEgg(pancake);
            pancake = new PancakeWithHum(pancake);
    
            System.out.println("我选择的套餐为:"+pancake.getMsg()+"\n 价格为:"+pancake.getPrice());
    
        }
    }
    
  • 输出

    我选择的套餐为:一个煎饼
     价格为:5.0
    ===================================
    我选择的套餐为:一个煎饼+1个鸡蛋,+1个鸡蛋,+1根火腿,
     价格为:9.0
    
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、现有咖啡馆订单系统项目(示例项目) 咖啡种类:Espresso、ShortBlack、LongBlack、De...
    朕要回幼儿园阅读 460评论 0 1
  • 1:什么是装饰者设计模式?百度百科:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。...
    pkingdog阅读 503评论 0 1
  • 本章可以称为“给爱用继承的人一个全新的设计眼界” ,我们即将再度探讨典型的继承滥用问题。你将在本章学到如何使用对象...
    黑夜0411阅读 409评论 0 0
  • 一、装饰者模式定义:通过组合和委托,动态的扩展被装饰者的行为。 二、设计方法:装饰者和被装饰者实现同样的接口,装饰...
    BrooksLee100阅读 163评论 0 0
  • 简单说明: str默认实现调用repr,str注重可读性,repr注重消除二义性,print,logger会用st...
    剑侠飞蓬阅读 370评论 0 0