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

    Decorator模式?

    假如现在有一块蛋糕,如果只涂上奶油,其他什么都不加,就是奶油蛋糕。如果加上草莓,就是草莓奶油蛋糕。如果再加上一块黑色巧克力板,上面用白色巧克力写上姓名,然后插上代表年龄的蜡烛,就变成了一块生日蛋糕
    像这样不断地为对象添加装饰的设计模式被称为Decorator模式

    • 简单描述:一个基础共有的对象,你想赋予它什么责者那么你添加相关的职责修饰,这就是装饰器模式
    • Java I/O 中使用适配器的:

    理清职责

    作用:对普通的字符串,通过加入边框进行描述
    名字============》》说明
    Display ||| 用于显示字符串的抽象类
    stringDisplay ||| 用于显示单行字符串的类
    Border ||| 用于显示装饰边框的抽象类
    sideBorder ||| 用于只显示左右边框的类
    Fu11Border ||| 用于显示上下左右边框的类
    Main ||| 测试程序行为的类

    • 关系对象图:

    UML

    Code

    • MainT
    public class MainT {
    
        public static void main(String[] args) {
    
            Display display=new StringDisplay("hello decorator");
    
            display.show();
    
            Display display1=new SideBorder(display,'#');
    
            display1.show();
    
            Display fullBorder = new FullBorder(display1);
    
            fullBorder.show();
    
            Display display2=new SideBorder(
                    new FullBorder(
                            new FullBorder(
                                    new SideBorder(
                                            new FullBorder(
                                                    new StringDisplay("Lets it go")
                                            ),
                                            '*'
                                    )
                            )
                    )
            ,'/');
            display2.show();
    
    
    
        }
    }
    
    
    • Display
    public abstract class Display {
    
        // 获取横向字符数
        public abstract int getColumns();
    
        // 获取纵向行数
        public abstract int getRows();
    
        // 获取row行字符
        public abstract String getRowText(int row);
    
        // 显示
        public final void show(){
            for (int i = 0; i < getRows(); i++) {
                System.out.println(getRowText(i));
            }
        }
    
    }
    
    
    
    
    • StringDisplay
    
    public class StringDisplay extends Display {
    
        private String string;
    
        public StringDisplay(String string) {
            this.string = string;
        }
    
        @Override
        public int getColumns() {
            return string.getBytes().length;
        }
    
        @Override
        public int getRows() {
            return 1;
        }
    
        @Override
        public String getRowText(int row) {
            return row==0? string: null;
        }
    }
    
    
    
    • FullBorder
    public class FullBorder extends Border {
    
    
        public FullBorder(Display display) {
            super(display);
        }
    
        @Override
        public int getColumns() {
            return display.getColumns()+2;
        }
    
        @Override
        public int getRows() {
            return display.getRows()+2;
        }
    
        @Override
        public String getRowText(int row) {
    
            if(row==0)
                return "+"+makeLine("-",display.getColumns())+"+";
            else if(row==display.getRows()+1)
                return "+"+makeLine("-",display.getColumns())+"+";
            else
                return "|"+display.getRowText(row-1)+"|";
        }
    
        private String makeLine(String s, int columns) {
            StringBuffer buffer = new StringBuffer();
            for (int i = 0; i < columns; i++) {
                buffer.append(s);
            }
            return buffer.toString();
        }
    }
    
    
    
    • SideBorder
    public class SideBorder extends Border {
    
        private char aChar;
    
        public SideBorder(Display display,char ch) {
            super(display);
            this.aChar=ch;
    
        }
    
        @Override
        public int getColumns() {
            return display.getColumns()+2;
        }
    
        @Override
        public int getRows() {
            return display.getRows();
        }
    
        @Override
        public String getRowText(int row) {
            return aChar+display.getRowText(row)+aChar;
        }
    }
    
    
    
    
  • 相关阅读:
    【转】Mongo初体验
    公益图书馆-学习笔记六 volist嵌套
    公益图书馆-学习笔记五-jquery来动态设置div高度
    公益图书馆-学习笔记四-复选框及jquery的onchange函数
    JQuery学习
    公益图书馆-学习笔记三
    公益图书馆-OnshelfController-代码学习
    公益图书馆-学习笔记二
    相似图像搜索从训练到服务全过程
    pickle 基础用法
  • 原文地址:https://www.cnblogs.com/dgwblog/p/9846783.html
Copyright © 2011-2022 走看看