zoukankan      html  css  js  c++  java
  • 设计模式:装饰模式

      装饰模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。

     装饰模式功能角色:

      抽象构建角色(Component):真实对象和装饰对象有相同接口。

      具体构建角色(ConcreteComponent):如Io中FileInputStream,

      装饰角色(Decorator):持有一个抽象构建角色的引用。装饰对象接收所有客户端 的请求,并把这些请求转发给真实对象。

                这样在真实对象调用前后增加新的功能。

      具体装饰角色(ConcreteDecorator):复制给构建对象增加新功能

    案例:

      

    /**
     * 抽象组件
     */
    public interface ICar {
        void move();
    }
    
    //被裝飾對象
    class Car implements ICar {
    
        @Override
        public void move() {
            System.out.println("陸地上跑");
        }
    }
    //装饰角色 Decorator
    class SuperCar implements ICar {
    
        private ICar car;
    
        public SuperCar(ICar car) {
            this.car = car;
        }
    
        @Override
        public void move() {
            car.move();
        }
    }
    //具体装饰角色 ConcreteDecorator
    class FlyCar extends SuperCar {
        public FlyCar(ICar car) {
            super(car);
        }
    
        public void fly() {
            System.out.println("fly");
        }
    
        @Override
        public void move() {
            super.move();
            fly();
        }
    
    }
    
    class WaterCar extends SuperCar {
        public WaterCar(ICar car) {
            super(car);
        }
    
        public void water() {
            System.out.println("water");
        }
    
        @Override
        public void move() {
            super.move();
            water();
        }
    
    }
    
    class AiCar extends SuperCar {
        public AiCar(ICar car) {
            super(car);
        }
    
        public void ai() {
            System.out.println("auto");
        }
    
        @Override
        public void move() {
            super.move();
            ai();
        }
    
    }
    

      

    public class Client {
    
        public static void main(String[] args) {
            Car car = new Car();
            car.move();
    
            FlyCar flyCar = new FlyCar(car);
            flyCar.move();
            
            WaterCar waterCar =  new WaterCar(car);
            waterCar.move();
    
            WaterCar waterCar1 = new WaterCar(flyCar);
            waterCar1.move();
        }
    }
    

    1.装饰类SuperCar中,持有一个装饰角色对象ICar.

    2.此装饰类实现装饰构建ICar接口。

    3.装饰模式的对象图从呈链状结构。例子共三个具体装饰类。FlyCar, WaterCar, AiCar.各装饰对象可以相互持有引用或组合。

    具体装饰类可将下一个具体装饰类包裹起来,动态增加新的功能。

    装饰模式和继承关系的目的都是扩展对象功能,但装饰模式可以提供比继承更多灵活性。

    装饰模式允许系统动态决定是否装饰某个类。继承则是在运行前就决定了。

  • 相关阅读:
    VUE学习笔记--Vue-cli
    洛谷 P5595 【XR-4】歌唱比赛(构造)
    洛谷 P3658 [USACO17FEB]Why Did the Cow Cross the Road III P(CDQ分治)
    洛谷 P2345 [USACO04OPEN]MooFest G(二维偏序,归并排序)
    洛谷 P1228 地毯填补问题(分治)
    洛谷 P4071 [SDOI2016]排列计数(排列组合、逆元、错排问题)
    初赛选择题知识点整理 & 听课笔记
    洛谷 P6833 [Cnoi2020]雷雨(set优化dijkstra,set、pair、struct的结合)
    洛谷 P1119 灾后重建(Floyd)
    洛谷 P1346 电车(双端队列广搜)
  • 原文地址:https://www.cnblogs.com/gcm688/p/10235648.html
Copyright © 2011-2022 走看看