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

    一 作用

    职责:动态的为一个对象增加新的功能

    装饰器模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。

    二、创建抽象组件接口

    Component抽象构件角色:真实对象和装饰对象有相同的接口。这样,客户端对象就能够以与真实对象相同的方式同装饰对象交互。

    public interface ICar {
        void move();
    }

    三、构建具体角色

    具体构件角色(真实对象)

    public class Car implements ICar{
        @Override
        public void move() {
            System.out.println("在陆地上跑");
        }
    }

    装饰角色:持有一个抽象构件的引用。装饰对象接受所有客户端的请求,并把这些请求转发给真实的对象。这样,就能在真实对象调用前后增加新的功能。

    public class SuperCar implements ICar{
        private ICar iCar;
    
        public SuperCar(ICar iCar){
            this.iCar = iCar;
        }
    
        @Override
        public void move() {
            iCar.move();
        }
    }

    具体装饰角色:负责给构件对象增加新的责任。

    public class FlyCar extends SuperCar{
    
        public FlyCar(ICar iCar) {
            super(iCar);
        }
    
        public void fly(){
            System.out.println("在天上飞的汽车");
        }
    
        @Override
        public void move() {
            super.move();
            fly();
        }
    }
    public class WaterCar extends SuperCar{
    
        public WaterCar(ICar iCar) {
            super(iCar);
        }
    
        public void water(){
            System.out.println("在水里游");
        }
        @Override
        public void move() {
            super.move();
            water();
        }
    }
    具体装饰角色
    public class WaterCar extends SuperCar{
    
        public WaterCar(ICar iCar) {
            super(iCar);
        }
    
        public void water(){
            System.out.println("在水里游");
        }
        @Override
        public void move() {
            super.move();
            water();
        }
    }

    四、创建测试类

    
    
    public class DecoratorTest {

    public static void main(String[] args) {
    Car car = new Car();
    car.move();
    System.out.println("_______________________________________________________");

    //增加一个可以飞行的功能
    FlyCar flycar = new FlyCar(car);
    flycar.move();
    System.out.println("_______________________________________________________");

    //增加一个可以下水跑的功能
    WaterCar waterCar = new WaterCar(car);
    waterCar.move();
    System.out.println("_______________________________________________________");

    //增加可以飞行同时也可以下水跑的功能
    WaterCar waterCar2 = new WaterCar(new FlyCar(car));
    waterCar2.move();
    System.out.println("_______________________________________________________");

    }
    }
     

    五、效果图

    陆地上跑
    _______________________________________________________
    陆地上跑
    在天上飞的汽车
    _______________________________________________________
    陆地上跑
    在水里游
    _______________________________________________________
    陆地上跑
    在天上飞的汽车
    在水里游
    _______________________________________________________

    六、实际应用

    七、总结

    装饰模式(Decorator)也叫包装器模式(Wrapper);

    装饰模式降低系统的耦合度,可以动态的增加或删除对象的职责,并使得需要装饰的具体构建类和具体装饰类可以独立变化,以便增加新的具体构建类和具体装饰类。

    优点:

    • 扩展对象功能,比继承灵活,不会导致类个数急剧增加
    • 可以对一个对象进行多次装饰,创造出不同行为的组合,得到功能更加强大的对象
    • 具体构建类和具体装饰类可以独立变化,用户可以根据需要自己增加新的具体构件子类和具体装饰子类

      缺点:

    • 产生很多小对象。大量小对象占据内存,一定程度上影响性能
    • 装饰模式易于出错,调试排查比较麻烦
  • 相关阅读:
    黑马程序员文件流的写入
    SCOPE_IDENTITY()代替 @@IDENTITY
    Asp.net 常用的正则表达式汇集
    jquery工作小笔记:jquery获取页面上控件的值
    将公历转换成农历的类_C#
    数字人民币(RMB)转化为大写字母
    常用JS判断各种格式,以及替换函数等
    iis预览.net发布的网站时遇到的莫名问题:无资源行。
    sql 自动补位
    switchhost引发的问题
  • 原文地址:https://www.cnblogs.com/yjjyves/p/9147980.html
Copyright © 2011-2022 走看看