zoukankan      html  css  js  c++  java
  • 设计模式——装饰模式(Decorator Pattern)

      装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

      UML图:

      

      模型类:

      

    Component类:
    package com.cnblog.clarck;
    
    /**
     * 接口对象,可以动态的给对象添加职责
     * 
     * @author clarck
     * 
     */
    public abstract class Component {
        public abstract void Operation();
    }
    ConcreateComponent类:
    package com.cnblog.clarck;
    
    /**
     * 具体的装饰对象,起到给Component添加职责
     * 
     * @author clarck
     * 
     */
    public class ConcreateComponent extends Component {
    
        @Override
        public void Operation() {
            System.out.println("具体对象的操作");
        }
    
    }
    Decorator类:
    package com.cnblog.clarck;
    
    /**
     * 装饰抽象类,继承了Component,从外来类来扩展Component类的功能,
     * 但对于Component来说是不需要知道Decorator的存在的。
     * 
     * @author clarck
     * 
     */
    public abstract class Decorator extends Component {
        protected Component mComponent;
    
        public void setComponent(Component component) {
            mComponent = component;
        }
        
        @Override
        public void Operation() {
            if (mComponent != null) {
                mComponent.Operation();
            }
        }
    
    }

    ConcreateDecoratorA类:
    package com.cnblog.clarck;
    
    /**
     * 具体的的装饰对象,起到给Component添加职责的作用
     * 
     * @author clarck
     * 
     */
    public class ConcreateDecoratorA extends Decorator {
        private String addedState;
    
        @Override
        public void Operation() {
            super.Operation();
            addedState = "New State";
            System.out.println("具体装饰对象A的操作" + addedState);
        }
    
    }
    ConcreateDecoratorB类:
    package com.cnblog.clarck;
    
    /**
     * 具体的装饰类B
     * 
     * @author clarck
     * 
     */
    public class ConcreateDecoratorB extends Decorator {
    
        @Override
        public void Operation() {
            super.Operation();
            addedBehaivor();
            System.out.println("具体装饰对象B");
        }
    
        private void addedBehaivor() { //用来区别ConcreateDecoratorA
            
        }
    }
    测试类:
    package com.cnblog.clarck;
    
    /**
     * 测试类
     * 
     * @author clarck
     * 
     */
    public class Test {
        public static void main(String[] args) {
            ConcreateComponent component = new ConcreateComponent();
            ConcreateDecoratorA decoratorA = new ConcreateDecoratorA();
            ConcreateDecoratorB decoratorB = new ConcreateDecoratorB();
    
            decoratorA.setComponent(component);
            decoratorB.setComponent(decoratorA);
            decoratorB.Operation();
        }
    }
  • 相关阅读:
    178
    177
    176
    175
    To Do List
    洛谷 P4198 楼房重建
    斯特林数
    容斥原理
    组合数学笔记
    激光相机数据融合(6)--激光相机标定
  • 原文地址:https://www.cnblogs.com/tanlon/p/3385283.html
Copyright © 2011-2022 走看看