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

    一、装饰模式的类图如下

    下载

    在装饰模式中的角色有:

      ●  抽象构件(Component)角色:就是需要装饰者的基类

      ●  具体构件(ConcreteComponent)角色:具体需要装饰的实例类

      ●  装饰(Decorator)角色:装饰物/装饰物 的基类

      ●  具体装饰(ConcreteDecorator)角色:具体装饰物类

    话不多说,先看实例:

    二、装饰模式具体实例

    待装饰类的基类:

    /**
     * 人
     */
    public interface People {
        public void speak();
    }

    具体待装饰类   ,中国人一出生就说汉语,   在人生旅途中也需要学习多种语言来装饰自己

    /**
     *
     * 中国人类   实现people
     * 重写speak()方法 , 中国人说汉语
     */
    public class Chinese implements People {
        @Override
        public void speak() {
            System.out.println("中国娃说汉语");
        }
    }

    装饰物/装饰品 的基类  --此处装饰类  为语言

    /**
     * 装饰类
     * 语言基类
     */
    public class Language implements People {
        private People people;
    
        public Language() {
        }
    
        public Language(People people) {
            this.people = people;
        }
    
        @Override
        public void speak() {
            people.speak();
        }
    }

    具体装饰类1:    装饰自我  - - 学习英语

    /**
     * 具体装饰类1
     * 学习说英语
     */
    public class English extends Language{
    
        public English(People people) {
            super(people);
            people.speak();
        }
    
        @Override
        public void speak() {
            System.out.println("学会说英语");
        }
    }

    具体装饰类2    装饰自我  - - 学习法语

    /**
     * 具体装饰类2
     * 学习说法语
     */
    public class French extends Language{
        public French(People people) {
            super(people);
            people.speak();
        }
    
        @Override
        public void speak() {
    
            System.out.println("学会说法语");
        }
    }

    具体装饰类3    装饰自我  - - 学习德语

    **
     * 具体装饰类
     * 学习说德语
     */
    public class German extends  Language{
        public German(People people) {
            super(people);
            people.speak();
        }
    
        @Override
        public void speak() {
            System.out.println("学会说德语");
        }
    }

    测试类:

    public class main {
        public static void main(String[] args) {
            People people  =  new Chinese();
           /* People people1 = new English(people);
            People people2 = new French(people1);
            people2.speak();*/
           People zhangsan = new English(new French(new German(people)));
           zhangsan.speak();
        }
    }

    输出结果:

    输出结果.

  • 相关阅读:
    VS2010之– Web Development(四)-将WebApplication打包发布到IIS
    .NET中TextBox控件设置ReadOnly=true后台取不到值三种解决方法
    jQuery 二级联动
    ajax实现无刷新两级联动DropDownList
    CheckStyle
    《Thinking in Java》学习笔记(三)
    Java垃圾回收机制[转]
    《Thinking in Java》学习笔记(二)
    MySQL操作的一些优化
    《Thinking in Java》学习笔记(一)
  • 原文地址:https://www.cnblogs.com/Actexpler-S/p/8179998.html
Copyright © 2011-2022 走看看