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();
        }
        
    }

    总结:

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

  • 相关阅读:
    底部菜单栏之Fragment的详细介绍和使用方法
    Warm up 2
    如何做好一位资深的web前端工程师
    使用 HTML5 canvas 绘制精美的图形
    计算元素距离浏览器左边的距离
    [JSOI2016]独特的树叶
    【SDOI2009】Elaxia的路线
    【SCOI2009】最长距离
    【SCOI2009】围豆豆
    【AHOI2005】穿越磁场
  • 原文地址:https://www.cnblogs.com/justmehyp/p/6217754.html
Copyright © 2011-2022 走看看