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

    设计模式-装饰器模式

    定义

    是指在不改变原来对象的基础上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能)。

    属于结构型。

    适用场景

    • 用于扩展一个类的功能或给一个类添加附加职责
    • 动态的给一个对象添加功能,这些功能可以再动态撤销

    UML 类图

    image

    装饰器和被装饰对象都继承统一父类 Component

    image

    代码实现

    package com.black.design.pattern.decorator;
    
    /**
     * 父类组件
     * @author black
     *
     */
    public abstract class Component {
    
        //操作
        public  abstract void operation();
    }
    
    
    package com.black.design.pattern.decorator;
    
    /**
     * 被装饰者
     * @author black
     *
     */
    public class ConcreteComponent extends Component {
    
        @Override
        public void operation() {
           System.out.println("做工作...");
        }
    
    }
    
    
    package com.black.design.pattern.decorator;
    
    /**
     * 装饰器
     * @author black
     *
     */
    public abstract class Decorator extends Component {
        
        private Component component;
    
        public Decorator(Component c) {
            this.component = c;
        }
        
        @Override
        public void operation() {
            component.operation();
        }
    
    }
    
    
    package com.black.design.pattern.decorator;
    /**
     * 工作渴了,喝口可乐
     * @author black
     *
     */
    public class ConreteDecoratorDrink extends Decorator {
    
        public ConreteDecoratorDrink(Component c) {
            super(c);
        }
        
        @Override
        public void operation() {
            super.operation();
            System.out.println("这会儿有点渴了,喝了一口可乐;");
        }
        
    
        public void operationFirst() {
            System.out.println("第一步,首先...");
        }
        
        public void operationLast() {
            System.out.println("最后,...");
        }
    }
    
    
    package com.black.design.pattern.decorator;
    /**
     * 好记性不如烂笔头,记一下笔记;
     * @author black
     *
     */
    public class ConreteDecoratorNote extends Decorator {
    
        public ConreteDecoratorNote(Component c) {
            super(c);
        }
        
        @Override
        public void operation() {
            super.operation();
            System.out.println("好记性不如烂笔头,记一下笔记;");
        }
    }
    
    

    测试:

    package com.black.design.pattern.decorator;
    
    public class Client {
    
        public static void main(String[] args) {
            
            Component p;
            p= new ConcreteComponent();//先工作
            p = new ConreteDecoratorNote(p);//实时记笔记
            p = new ConreteDecoratorDrink(p);//喝口可乐
            p.operation();
        }
    }
    
    
    

    结果:

    做工作...
    好记性不如烂笔头,记一下笔记;
    这会儿有点渴了,喝了一口可乐;
    

    优缺点

    优点:
    装饰器是继承的有力补充,比继承更灵活。
    通过使用不同的装饰类以及这些装饰类的排列组合,可实现不同的效果。
    装饰器完全符合开闭原则。

    缺点:
    会产生更多的类,增加程序复杂性;
    动态装饰,多层装饰时会很复杂。

    本文来自博客园,作者:不安分的黑娃,转载请注明原文链接:https://www.cnblogs.com/lihw-study/p/15154827.html

  • 相关阅读:
    *关于如何获取指定表的指定字段的数据类型的方法
    *检查表是否存在
    *用Sql添加删除字段,判断字段是否存在的方法
    *MSSQL三个关键系统表
    *系统表的应用
    VC++ ADO编程入门简介
    int i=0; i=i++ System.out.Println(i)
    Microsoft Visual C++ 6.0 关联源代码
    VC ADO接口详解
    程序员每年该做的事
  • 原文地址:https://www.cnblogs.com/lihw-study/p/15154827.html
Copyright © 2011-2022 走看看