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

    装饰模式简介

    定义:属于结构型模式,不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式

    目的:扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀,在不想增加很多子类的情况下扩展类,将具体功能职责划分,同时继承装饰者模式

    优点:装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用

       通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果

       装饰器模式完全遵守开闭原则

    缺点:装饰模式会增加许多子类,过度使用会增加程序得复杂性

    实现

    角色:抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象

       具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责

       抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能

       具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任

    代码:

     1 /**抽象构件**/
     2 public interface Shape {
     3     public void draw();
     4 
     5 }
     6 
     7 /**具体构件**/
     8 public class ShapeImpl implements Shape{
     9 
    10     @Override
    11     public void draw() {
    12         // TODO Auto-generated method stub
    13         System.out.println("此时的我是齐天大圣");
    14         
    15     }
    16 
    17 }
    18 
    19 /**抽象装饰类**/
    20 public abstract class ShapeDecorator implements Shape{
    21     protected Shape shape;
    22     public ShapeDecorator (Shape shape){
    23         this.shape = shape;
    24     }
    25     
    26     public void draw(){
    27         shape.draw();
    28     }
    29 
    30 }
    31 
    32 /**具体装饰类A**/
    33 public class DefiniteShapeDecratorA extends ShapeDecorator{
    34 
    35     public DefiniteShapeDecratorA(Shape shape) {
    36         super(shape);
    37     }
    38     private void setdrawA(){
    39         System.out.println("此时的我学艺结束,去东海抢到了定海神针");
    40     }
    41     @Override
    42     public void draw(){
    43         setdrawA();
    44         shape.draw();
    45     }
    46 
    47 }
    48 
    49 /**具体装饰类B**/
    50 public class DefiniteShapeDecratorB extends ShapeDecorator{
    51 
    52     public DefiniteShapeDecratorB(Shape shape) {
    53         super(shape);
    54         // TODO Auto-generated constructor stub
    55     }
    56     private void setdrawB(){
    57         System.out.println("此时的我因大闹天宫被压在五指山下-_-");
    58     }
    59     @Override
    60     public void draw(){
    61         shape.draw();
    62         setdrawB();
    63         
    64     }
    65 
    66 }
    67 
    68 /**测试方法**/
    69 public class Test {
    70 
    71     public static void main(String[] args) {
    72         // TODO Auto-generated method stub
    73         Shape shape = new ShapeImpl();
    74         
    75         ShapeDecorator shapeDecorator0 = new DefiniteShapeDecratorA(shape);
    76         System.out.println("Test Begin============");
    77         shapeDecorator0.draw();
    78         System.out.println("Test End============");
    79         
    80         ShapeDecorator shapeDecorator1 = new DefiniteShapeDecratorB(shape);
    81         System.out.println("Test Begin============");
    82         shapeDecorator1.draw();
    83         System.out.println("Test End============");
    84     }
    85 
    86 }
    87 
    88 测试结果:
    89 Test Begin============
    90 此时的我学艺结束,去东海抢到了定海神针
    91 此时的我是齐天大圣
    92 Test End============
    93 Test Begin============
    94 此时的我是齐天大圣
    95 此时的我因大闹天宫被压在五指山下-_-
    96 Test End============
  • 相关阅读:
    FastDFS 集群 安装 配置
    springboot 集成fastDfs
    分布式文件系统FastDFS详解
    上传下载
    Spring Boot:上传文件大小超限制如何捕获 MaxUploadSizeExceededException 异常
    MySQL报错解决方案:2013-Lost connection to MySQL server
    JWT与Session比较和作用
    html跑马灯/走马灯效果
    后端排序,debug模式中map的顺序出错
    js调用后台接口进行下载
  • 原文地址:https://www.cnblogs.com/carblack/p/14132929.html
Copyright © 2011-2022 走看看