zoukankan      html  css  js  c++  java
  • 设计模式学习–Decorator

    What

    Decorator:动态地给一个对象加入一些额外的职责。

    就添加功能来说。Decorator模式相比生成子类更加灵活。

    Why

    Decorator模式适用于能够动态的给对象增删职责。比方qq秀我们能够选择自己形象,并动态的加入衣服以及装饰,让自己的形象感觉高大上起来。Decorator适用于例如以下情况:
    1.在不影响其它对象的情况下,以动态、透明的方式给单个对象加入职责。
    2.处理那些能够撤销职责的场景。


    3.当不能採用子类的方法进行扩充时。

    How

    如果例如以下场景,近期又个app比較火,FaceQ能够用来创建自己的卡通形象。如果实现这种功能就能够使用Decorator模式。


    基础的装扮类

    public class Face {
    
        private String name;
    
        public Face(){
    
        }
    
        public Face(String name){
            this.name=name;
        }
    
        public void show(){
            System.out.println("開始装扮Face:" + name);
        }
    
    }
    

    脸型装扮类

    public class FaceFeature extends Face{
    
        private Face face;
    
        public FaceFeature(){
    
        }
    
        public void decorator(Face face){
            this.face=face;
        }
    
        @Override
        public void show() {
            face.show();
        }
    }
    

    圆型脸

    public class RoundFaceFeature extends FaceFeature{
    
        @Override
        public void show() {
            System.out.println("加入圆脸");
            super.show();
        }
    }
    

    方型脸

    public class SquareFaceFeature extends FaceFeature {
        @Override
        public void show() {
            System.out.println("加入方脸");
            super.show();
        }
    }
    

    嘴型装扮类

    public class Mouth extends Face {
    
        private Face face;
    
        public Mouth(){
    
        }
    
        public void decorator(Face face){
            this.face=face;
        }
    
        @Override
        public void show() {
            face.show();
        }
    }
    

    微笑嘴型

    public class SmileMouth extends Mouth{
    
        @Override
        public void show() {
            System.out.println("加入微笑");
            super.show();
        }
    }
    

    闭嘴嘴型

    public class ClosedMouth extends Mouth {
    
        @Override
        public void show() {
            System.out.println("加入闭嘴。

    "); super.show(); } }

    调用以上装扮类

        public static void main(String[] args){
            Face face=new Face("test");
            RoundFaceFeature roundFaceFeature=new RoundFaceFeature();
            SmileMouth smileMouth=new SmileMouth();
            roundFaceFeature.decorator(face);
            smileMouth.decorator(roundFaceFeature);
            smileMouth.show();
        }
    

    以上代码的UML图例如以下:
    decorator

    Discuss

    在以上演示样例中Face类既充当了职责接口也是详细的装扮对象,FaceFeature以及Mouth为两个装扮类。在java的jdk中也有一个比較典型的Decorator模式使用的地方。在java的io类中,在OutputStream。InputStream,Reader,Writer等都用到了Decorator模式。有时间能够细致分析一下。

  • 相关阅读:
    Linux开机流程【原创】
    Linux下无需按下回车(无阻塞)读取输入键值
    Sql Server 列转行 Pivot使用
    mysql
    mysql
    mysql
    CI
    mysql
    Snagit: Scrolling is not working
    Something about SnagIt
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/6951139.html
Copyright © 2011-2022 走看看