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

    装饰模式

    一、作用:

    为已有的功能添加新的功能的设计模式,当系统需要新的功能时候,要在原有的基础上增加一点新的功能的时候,也就是装饰一点功能的时候,不需要再原有的代码上进行修改。

    装饰的功能就是把核心职责和核心功能划分开了。

    对比生成器模式:

    (1)生成器模式类执行是有顺序的

    (2)装饰模式执行顺序是没有顺序的,是随机的,想怎么装饰就怎么装饰,装饰的是一些无关紧要的事情,核心的代码还是之前的类在做

    二、类图

    解释一下:

    左边两个实现类(ConsoleLogger FileLogger)是核心的实现类,主要的功能都是由这两个实现的

    右边两个实现类(UpLogger,XMLLogger)是装饰类,只是加了一些装饰的属性,核心的功能还是左边的那两个类

    三、实现

    1、定义方法的接口

    public interface ICook {
        public void cook();
    }
    View Code

    2、两个核心实现类

    public class Cabbage implements ICook {
        @Override
        public void cook() {
            // TODO Auto-generated method stub
            System.out.println("cook cabbage");
        }
    }
    public class Vegetable implements ICook {
        @Override
        public void cook() {
            // TODO Auto-generated method stub
            System.out.println("cook vegetable");
        }
    }
    View Code

    3、定义Decorator的方式 抽象类

    public abstract class Decorator implements ICook {
        protected ICook cook;
        public Decorator(ICook cook)
        {
            this.cook = cook;
        }
    }
    View Code

    4、两个实现装饰功能的 实现类

    public class PepperDecorator extends Decorator {
        public PepperDecorator(ICook cook) {
            super(cook);
        }
        @Override
        public void cook() {
            addPepper();
            cook.cook();
        }
        public void addPepper()
        {
            System.out.println("add some pepper");
        }
    }
    public class SugarDecorator extends Decorator {
    
        public SugarDecorator(ICook cook) {
            super(cook);
        }
        @Override
        public void cook() {
            addSugar();
            cook.cook();
        }
        public void addSugar()
        {
            System.out.println("add some sugar");
        }
    }
    View Code

    5、测试类

    public class Client {
    
        public static void main(String[] args) {
            Client client = new Client();
            ICook cook = new Cabbage();
            ICook pepper = new PepperDecorator(cook);
            pepper.cook();
        }
    }
    View Code
  • 相关阅读:
    图片 音频 视频上传
    asp.net导出execl和图片
    asp.net网页播放MP4 出错
    js 定时器
    js的Math和正则
    js字符串,Arry数组,join连接,push,shift,sort
    js的argument参数
    js函数对象
    js简单语法,循环
    position的relative
  • 原文地址:https://www.cnblogs.com/sunshisonghit/p/4376503.html
Copyright © 2011-2022 走看看