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

    一、任务

    手机功能的升级

    用装饰模式模拟手机功能的升级过程:简单的手机(SimplePhone)在接收来电时,会发出声音提醒主人;而JarPhone除了声音还能振动;更高级的手机(ComplexPhone)除了声音、振动外,还有灯光闪烁提示。

    二、类图

    三、代码

    1、Java

     1 package tutorial11;
     2 
     3 public class Client {
     4 
     5     public static void main(String[] args) {
     6         // TODO 自动生成的方法存根
     7 
     8           Phone p1 = new SimplePhone();
     9           System.out.println("生产简单手机");
    10           p1.serviceCall();
    11           
    12           System.out.println("***********************");
    13           Phone p2 = new JarPhone(p1);
    14           System.out.println("升级手机为JarPhone");
    15           p2.serviceCall();
    16           System.out.println("***********************");
    17           Phone p3 = new ComplexPhone(p2);
    18           System.out.println("升级手机为ComplexPhone");
    19           p3.serviceCall();
    20     }
    21 
    22 }
    Client
    1 package tutorial11;
    2 
    3 public abstract class Phone {
    4 
    5     public void serviceCall() {
    6         
    7     }
    8 }
    Phone
    1 package tutorial11;
    2 
    3 public class SimplePhone extends Phone {
    4 
    5     public void serviceCall() {
    6         System.out.println("SimplePhone:发出声音提醒主人电话来了");
    7     }
    8 }
    SimplePhone
     1 package tutorial11;
     2 
     3 public class PhoneDecoration extends Phone {
     4 
     5     private Phone phone=null;
     6     public PhoneDecoration(Phone phone) {
     7           if(phone!=null){
     8                  this.phone = phone;
     9              }else{
    10                  this.phone = new SimplePhone();
    11              }
    12     }
    13     @Override
    14     public void serviceCall() {
    15         phone.serviceCall();
    16     }
    17 }
    PhoneDecoration
     1 package tutorial11;
     2 
     3 public class JarPhone extends PhoneDecoration {
     4 
     5     public JarPhone(Phone phone) {
     6         super(phone);
     7         // TODO 自动生成的构造函数存根
     8     }
     9     @Override
    10     public void serviceCall() {
    11         super.serviceCall();
    12         System.out.println("JarPhone:发出声音并震动提醒主人电话来了");
    13     }
    14     
    15 
    16 }
    JarPhone
     1 package tutorial11;
     2 
     3 public class ComplexPhone extends PhoneDecoration {
     4 
     5     public ComplexPhone(Phone phone) {
     6         super(phone);
     7         // TODO 自动生成的构造函数存根
     8     }
     9     @Override
    10     public void serviceCall() {
    11         super.serviceCall();
    12         System.out.println("ComplexPhone:发出声音、震动并灯光闪烁提醒主人电话来了");
    13     }
    14     
    15 
    16 }
    ComplexPhone

    2、C++

     1 #include <iostream>
     2 #include <string>
     3 #include <list>
     4 using namespace std;
     5 
     6 class Phone
     7 {
     8 public:
     9     Phone() {}
    10     virtual ~Phone() {}
    11     virtual void ShowDecorate() {}
    12 };
    13 //具体的手机类
    14 class SimplePhone : public Phone
    15 {
    16 private:
    17     string namePhone;
    18 public:
    19     SimplePhone(string name) : namePhone(name) {}
    20     ~SimplePhone() {}
    21     void ShowDecorate() { 
    22         cout  <<endl<<namePhone << ":" << endl; 
    23     }
    24 };
    25 //装饰类
    26 class DecoratorPhone : public Phone
    27 {
    28 private:
    29     Phone* m_phone;  //要装饰的手机
    30 public:
    31     DecoratorPhone(Phone* phone) : m_phone(phone) {}
    32     virtual void ShowDecorate() { m_phone->ShowDecorate(); }
    33 };
    34 //具体的装饰类
    35 class DecoratorPhoneA : public DecoratorPhone
    36 {
    37 public:
    38     DecoratorPhoneA(Phone* phone) : DecoratorPhone(phone) {}
    39     void ShowDecorate() { DecoratorPhone::ShowDecorate(); AddDecorate(); }
    40 private:
    41     void AddDecorate() { cout << "发出声音提示主人电话来了" << endl; } //增加的装饰
    42 };
    43 //具体的装饰类
    44 class DecoratorPhoneB : public DecoratorPhone
    45 {
    46 public:
    47     DecoratorPhoneB(Phone* phone) : DecoratorPhone(phone) {}
    48     void ShowDecorate() { DecoratorPhone::ShowDecorate(); AddDecorate(); }
    49 private:
    50     void AddDecorate() { cout << "震动提示主人电话来了" << endl; } //增加的装饰
    51 };
    52 //具体的装饰类
    53 class DecoratorPhoneC : public DecoratorPhone
    54 {
    55 public:
    56     DecoratorPhoneC(Phone* phone) : DecoratorPhone(phone) {}
    57     void ShowDecorate() { DecoratorPhone::ShowDecorate(); AddDecorate(); }
    58 private:
    59     void AddDecorate() { cout << "闪烁灯光提示主人电话来了" << endl; } //增加的装饰
    60 };
    61 int main()
    62 {
    63     Phone* iphone = new SimplePhone("SimplePhone");
    64     Phone* dpa = new DecoratorPhoneA(iphone);
    65     dpa->ShowDecorate();
    66 
    67     Phone* phone = new SimplePhone("JarPhone");
    68     Phone* dpA = new DecoratorPhoneA(phone);
    69     Phone* dpb = new DecoratorPhoneB(dpA);
    70     dpb->ShowDecorate();
    71 
    72     Phone* cphone = new SimplePhone("ComplexPhone");
    73     Phone* d = new DecoratorPhoneA(cphone);
    74     Phone* dpB = new DecoratorPhoneB(d);
    75     Phone* dpC = new DecoratorPhoneC(dpB);
    76     dpC->ShowDecorate();
    77 
    78     delete dpa;
    79     delete iphone;
    80 
    81     delete dpA;
    82     delete dpb;
    83     delete phone;
    84 
    85     delete d;
    86     delete dpB;
    87     delete dpC;
    88     delete cphone;
    89 }
    Client

    四、结果

    Java截图:

    2、c++结果截图

  • 相关阅读:
    JSON解析之——Android
    Xml解析之——Java/Android/Python
    Design Pattern —— Singleton
    设计模式(10)--观察者模式
    设计模式(9)--建造者模式
    设计模式(8)--外观模式
    设计模式(7)--模板模式
    设计模式(6)--原型模式
    设计模式(5)--工厂模式
    设计模式(4)--代理模式
  • 原文地址:https://www.cnblogs.com/Lizhichengweidashen/p/15563980.html
Copyright © 2011-2022 走看看