zoukankan      html  css  js  c++  java
  • 设计模式学习(九) 装饰模式

    职责:

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

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

    实现细节:

      -- 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)

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

    优点:

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

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

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

    缺点:

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

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

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

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

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

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

  • 相关阅读:
    动网16位gb2312md5加密
    开发windows7侧边栏小工具
    MVC文档地址
    关闭FCNs(文件修改监控)
    内存管理
    android笔记一(Button)
    android笔记五ImageButton
    android笔记三FrameLayout
    linux内核各组件的功能介绍
    C++面试题
  • 原文地址:https://www.cnblogs.com/lipeng0824/p/4429989.html
Copyright © 2011-2022 走看看