• 设计模式-装饰器模式


    设计模式-装饰器模式

    定义

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

    属于结构型。

    适用场景

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

    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

  • 相关阅读:
    Servlet编程实例1
    Servlet
    JDBC之代码优化
    JDBC数据库编程
    数据库常识
    数据库基本操作
    STM32CUBEMX入门学习笔记3:HAL库以及STM32CUBE相关资料
    QT入门学习笔记2:QT例程
    爬虫制作入门学习笔记2:[转]python爬虫实例项目大全
    中移物联网onenet入门学习笔记2:中移物联的通信格式
  • 原文地址:https://www.cnblogs.com/lihw-study/p/15154827.html
Copyright © 2020-2023  润新知