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
  • 相关阅读:
    PAT (Advanced Level) 1010. Radix (25)
    PAT (Advanced Level) 1009. Product of Polynomials (25)
    PAT (Advanced Level) 1008. Elevator (20)
    PAT (Advanced Level) 1007. Maximum Subsequence Sum (25)
    PAT (Advanced Level) 1006. Sign In and Sign Out (25)
    PAT (Advanced Level) 1005. Spell It Right (20)
    PAT (Advanced Level) 1004. Counting Leaves (30)
    PAT (Advanced Level) 1001. A+B Format (20)
    PAT (Advanced Level) 1002. A+B for Polynomials (25)
    PAT (Advanced Level) 1003. Emergency (25)
  • 原文地址:https://www.cnblogs.com/sunshisonghit/p/4376503.html
Copyright © 2011-2022 走看看