• 装饰者模式--Java篇


      装饰者模式(Decorator)动态地给一个对象添加一些额外的职责,就增加功能来说,装饰者模式比生成子类更为灵活。

      1.定义接口,可以动态的给对象添加职责。

    1 package com.lujie;
    2 
    3 public interface SuperPerson {
    4     //定义一个接口,可以动态的给对象添加职责
    5     public abstract void show() ;
    6 }

      2.实现这个接口

     1 package com.lujie;
     2 
     3 public class Person implements SuperPerson{
     4     private String name;
     5     public Person() {
     6         // TODO Auto-generated constructor stub
     7     }
     8     public  Person(String name) {
     9         this.name=name;
    10     }
    11     //具体对象的操作
    12     public void show() {
    13         System.out.println("装饰者:"+name);
    14     }
    15 }

      3.装饰类

     1 package com.lujie;
     2 
     3 public class Finery extends Person{
     4     protected Person component;
     5     //设置component
     6     public void Decorate(Person component) {
     7         this.component=component;
     8     }
     9     //重写show(),实际执行的是component的show()操作
    10     public void show() {
    11         if(component!=null){
    12             component.show();
    13         }
    14     }
    15 
    16 }

      4.具体实现的装饰类

    1 package com.lujie;
    2 
    3 public class Shoes extends Finery{
    4     //首先执行本类的功能,再运行原Component的show(),相当于对原Component进行了装饰
    5     public void show() {
    6         System.out.println("皮鞋");
    7         super.show();
    8     }
    9 }
    1 package com.lujie;
    2 
    3 public class Suit extends Finery{
    4     //首先执行本类的功能,再运行原Component的show(),相当于对原Component进行了装饰
    5     public void show() {
    6         System.out.println("西装");
    7         super.show();
    8     }
    9 }
    package com.lujie;
    //具体服饰类
    public class TShirts extends Finery{
        //首先执行本类的功能,再运行原Component的show(),相当于对原Component进行了装饰
        public void show() {
            System.out.println("大体恤");
            super.show();
        }
    }
    1 package com.lujie;
    2 
    3 public class WearSneakers extends Finery{
    4     public void show() {
    5         System.out.println("破球鞋");
    6         super.show();
    7     }
    8 }

      5.测试用例:

     1 package com.lujie;
     2 
     3 public class PersonShowMain {
     4 
     5     public static void main(String[] args) {
     6         // TODO Auto-generated method stub
     7         Person person=new Person("小明");
     8         System.out.println("第一种装扮:");
     9         WearSneakers wSneakers=new WearSneakers();
    10         BigTrouser bigTrouser=new BigTrouser();
    11         TShirts tShirts=new TShirts();
    12         //装饰过程
    13         wSneakers.Decorate(person);
    14         bigTrouser.Decorate(wSneakers);
    15         tShirts.Decorate(bigTrouser);
    16         tShirts.show();
    17         //装饰过程二
    18         System.out.println("第二种装扮:");
    19         Suit suit=new Suit();
    20         wSneakers.Decorate(person);
    21         bigTrouser.Decorate(wSneakers);
    22         suit.Decorate(bigTrouser);
    23         suit.show();
    24     }
    25 
    26 }

      6.运行结果:

  • 相关阅读:
    暴力+前缀和——cf1335E
    【经典】区间dp——cf1336E
    简单几何+并查集 —— 2015NAQ K
    spring mvc 文件上传 和 异常页面处理
    ajax 入门
    Codeforces Round #558 (Div. 2)
    [SDOI2019]热闹又尴尬的聚会(图论+set+构造)
    [SDOI2019]移动金币(博弈论+阶梯Nim+按位DP)
    [ZJOI2019]浙江省选(半平面交)
    [ZJOI2019]开关(生成函数+背包DP)
  • 原文地址:https://www.cnblogs.com/luerniu/p/5442812.html
Copyright © 2020-2023  润新知