zoukankan      html  css  js  c++  java
  • 编程模式之装饰模式(Decorator)

    装饰模式由四个角色组成:抽象组件角色,抽象装饰者角色,具体组件角色,具体装饰者角色

    抽象组件角色:给出一个抽象接口,以规范“准备接受附加功能”的对象。

    抽象装饰者角色:持有一个组件(Component)对象的引用,并定义一个与抽象组件接口一致的接口。

    具体组件角色:定义一个准备接受附加功能的类。

    抽象装饰者角色:负责给组件对象“贴上”附加的责任。

    类图:

    JAVA代码:

    Conponent.java

    package com.decorator;
    
    public interface Component
    {
        void doSomeThing();
    }

    ConcreteConponent.java

    package com.decorator;
    
    public class ConcreteComponent implements Component
    {
    
        @Override
        public void doSomeThing()
        {
            System.out.println("功能A");
        }
    
    }

    Decorator.java

    package com.decorator;
    
    public class Decorator implements Component
    {
        private Component component;    //待修饰对象的一个引用
        
        public Decorator(Component component)
        {
            this.component = component;
        }
    
        @Override
        public void doSomeThing()
        {
            this.component.doSomeThing();
        }
    
    }

    ConcreteDecorator1.java

    package com.decorator;
    
    public class ConcreteDecorator1 extends Decorator
    {
    
        public ConcreteDecorator1(Component component)
        {
            super(component);
        }
        
        @Override
        public void doSomeThing()
        {
            super.doSomeThing();
            doAnotherThing();
        }
    
        private void doAnotherThing()
        {
            System.out.println("功能B");
        }
    }

    ConcreteDecorator2.java

    package com.decorator;
    
    
    public class ConcreteDecorator2 extends Decorator
    {
    
        public ConcreteDecorator2(Component component)
        {
            super(component);
        }
        
        @Override
        public void doSomeThing()
        {
            super.doSomeThing();
            doAnotherThing();
        }
        
        private void doAnotherThing()
        {
            System.out.println("功能C");
        }
    }

    Test.java

    package com.decorator;
    
    
    public class Test
    {
        public static void main(String[] args)
        {
            //ConcreteDecorator1对象装饰了ConcreteComponent对象
            //ConcreteDecorator2对象又修饰了ConcreteDecorator1对象
            //在不增加一个同时拥有ConcreteComponent、ConcreteDecorator1和ConcreteDecorator2三个类的功能
            //于一身的一个“新的类”的情况下,通过修饰,实现了同时拥有这些功能
            Component component = new ConcreteDecorator2(new ConcreteDecorator1(new ConcreteComponent()));
            
            component.doSomeThing();
        }
        
    }

    总结:

      装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,其可以在不创造更多子类的情况下将对象的功能加以扩展。

  • 相关阅读:
    Extjs4.0以上版本 Ext.Ajax.request请求的返回问题
    C# NPOI 操作Excel 案例
    C# Microsoft.Office 操作Excel总结
    asp.net core NLog将日志写到文件
    新装的SSMS一打开就显示VS许可证过期,但VS又运行正常,解决方法。
    sql server 查询log日志 sql语句
    sql server 删除所有表及所有存储过程、所有视图和递归查询、数字类型转为字符串
    C#使用Selenium+PhantomJS抓取数据
    python爬虫实例项目大全
    SQL Server TVPs 批量插入数据
  • 原文地址:https://www.cnblogs.com/justmehyp/p/6217754.html
Copyright © 2011-2022 走看看