• 设计模式学习(九) 装饰模式


    职责:

      -- 动态的为一个对象增加新的功能

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

    实现细节:

      -- Component抽象构件角色

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

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

          io流中的FileInputStream. FileOutputStream

      -- Decorator装饰角色:

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

      -- ConcreteDecorator

        负责给构件对象增加新的责任。

    代码实现:

    class FlyCar extends SuperCar{
    
        public FlyCar(ICar car) {
            super(car);
            
        } 
        
        public void fly(){
            System.out.println("天上飞");
        }
        
        @Override
        public void move(){
            super.move();
            fly();
        }
        
    }
    //ConcreteDecortor具体修饰角色
    class WaterCar extends SuperCar{
    
        public WaterCar(ICar car) {
            super(car);
            
        } 
        
        public void swim(){
            System.out.print("水里游");
        }
        
        @Override
        public void move(){
            super.move();
            swim();
        }
    }
    
    //ConcreteDecortor具体修饰角色
    class AICar extends SuperCar{
    
        public AICar(ICar car) {
            super(car);
            
        } 
        
        public void autoMove(){
            System.out.print("自动游");
        }
        
        @Override
        public void move(){
            super.move();
            autoMove();
        }
    }
    具体装饰角色
    package com.lp.decorator;
    
    /*抽象组件*/
    public interface ICar {
        void move();
    }
    抽象构件角色
    /*具体构件对象*/
    class Car implements ICar {
    
        @Override
        public void move() {
            System.out.println("陆地上跑!!");    
        }
        
    }
    具体构件对象
    class SuperCar implements ICar{ 
        private ICar car;
    
        public SuperCar(ICar car) {
            super();
            this.car = car;
        }
    
        @Override
        public void move() {
            car.move();
            
        }
        
    }
    装饰角色
    package com.lp.decorator;
    
    public class Client {
        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(flycar);
            watercar.move();
            
        }
    }
    客户端

    总结:

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

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

    优点:

      -- 扩展对象功能,比继承灵活,不会导致类个数急剧增加

      -- 可以对一个对象进行多次装饰,创造出不同行为的组合,得到功能更加强大的对象

      -- 具体构建类和具体装饰类可以独立变化,用户可以根据需要自己增加新的具体构件子类和具体装饰子类。

    缺点:

      -- 产生很多小对象,大量小对象占据内存,一定程度上影响性能。

      -- 装饰模式易于出错,调试排查比较麻烦。

    装饰模式和桥接模式的区别:

    两个模式都是为了解决过多子类对象问题,但他们的诱因不一样。

    桥接模式是对象自身现有机制沿着多个维度变化,是既有部分不稳定

    装饰模式是为了增加新的功能。

  • 相关阅读:
    AWS生产环境Pod挂载不了configmap、secret
    Ant学习
    Springframework3.1源码编译
    MyEclipse10 中增加svn插件
    如何测试java支持的最大内存
    Tomcat中部署后JspFactory报异常的解决方案
    win7x64下安装oraclex64版本后,plsql Developer无法登录的问题
    CentOS6.4安装及配置oracle
    VMWare安装redhat9后上网的的问题
    泛海精灵项目的回顾与反思
  • 原文地址:https://www.cnblogs.com/lipeng0824/p/4429989.html
Copyright © 2020-2023  润新知