• 设计模式:装饰模式


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

     装饰模式功能角色:

      抽象构建角色(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.各装饰对象可以相互持有引用或组合。

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

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

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

  • 相关阅读:
    MySQL视图更新
    JavaScript经典作用域问题
    进程间通信的几种方式
    Vue(MVVM)、React(MVVM)、Angular(MVC)对比
    CDN(Content Delivery Network)技术原理概要
    单点登录实现原理(SSO)
    composer 实现自动加载原理
    PHP 反射的简单使用
    php7安装php-redis扩展
    Git 简单入门(二)
  • 原文地址:https://www.cnblogs.com/gcm688/p/10235648.html
Copyright © 2020-2023  润新知