• 技术文章 >java >java基础

    java装饰者模式怎么用?

    小妮浅浅小妮浅浅2021-02-25 17:45:52原创2716

    1、使用说明

    (1)装饰者模式可以带来比继承更加灵活的扩展功能,使用更加方法,可以通过组合不同的装饰者对象来获取具有不同行为状态的多样化的结果。装饰者模式比继承更具良好的扩展性,完美的遵循开闭原则,继承是静态的附加责任,装饰者则是动态的附加责任。

    (2)装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

    2、实例

    public class HelloWorld {
        public static void main(String[] args) {
            //点一份炒饭
            FastFood food = new FriedRice();
            //花费的价格
            System.out.println(food.getDesc() + " " + food.cost() + "元");
     
            System.out.println("========");
     
            //点一份加鸡蛋的炒饭
            FastFood food1 = new FriedRice();
            food1 = new Egg(food1);
            //花费的价格
            System.out.println(food1.getDesc() + " " + food1.cost() + "元");
     
            System.out.println("========");
     
            //点一份加培根的炒面
            FastFood food2 = new FriedNoodles();
            food2 = new Bacon(food2);
            //花费的价格
            System.out.println(food2.getDesc() + " " + food2.cost() + "元");
        }
    }
     
    // 快餐抽象类
    abstract class FastFood {
        private float price;
        private String desc;
     
        public FastFood() {}
     
        public FastFood(float price, String desc) {
            this.price = price;
            this.desc = desc;
        }
     
        public float getPrice() {
            return price;
        }
     
        public void setPrice(float price) {
            this.price = price;
        }
     
        public String getDesc() {
            return desc;
        }
     
        public void setDesc(String desc) {
            this.desc = desc;
        }
     
        // 获取价格
        public abstract float cost();
    }
     
    // 炒饭
    class FriedRice extends FastFood {
        public FriedRice() {
            super(10, "炒饭");
        }
     
        @Override
        public float cost() {
            return getPrice();
        }
    }
     
    // 炒面
    class FriedNoodles extends FastFood {
        public FriedNoodles() {
            super(12, "炒面");
        }
     
        @Override
        public float cost() {
            return getPrice();
        }
    }
     
    // 配料
    abstract class Garnish extends FastFood {
        private FastFood fastFood;
     
        public FastFood getFastFood() {
            return fastFood;
        }
     
        public void setFastFood(FastFood fastFood) {
            this.fastFood = fastFood;
        }
     
        public Garnish(FastFood fastFood, float price, String desc) {
            super(price, desc);
            this.fastFood = fastFood;
        }
    }
     
    // 鸡蛋配料
    class Egg extends Garnish {
        public Egg(FastFood fastFood) {
            super(fastFood, 1, "鸡蛋");
        }
     
        @Override
        public float cost() {
            return getPrice() + getFastFood().getPrice();
        }
     
        @Override
        public String getDesc() {
            return super.getDesc() + getFastFood().getDesc();
        }
    }
     
    //培根配料
    class Bacon extends Garnish {
        public Bacon(FastFood fastFood) {
            super(fastFood,2,"培根");
        }
     
        @Override
        public float cost() {
            return getPrice() + getFastFood().getPrice();
        }
     
        @Override
        public String getDesc() {
            return super.getDesc() + getFastFood().getDesc();
        }
    }

    以上java装饰者模式的用法,希望能对大家有所帮助。更多Java学习指路:Java基础

    专题推荐:java装饰者模式
    品易云
    上一篇:java装饰者模式是什么? 下一篇:Java字节码执行的两种方式

    相关文章推荐

    • java代理模式有几种?• java之JDK动态代理是什么• java中CGLIB动态代理的介绍• java中不同代理的对比• java适配器模式是什么• java适配器模式的两种分类• java装饰者模式是什么?

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网