一、任务
手机功能的升级
用装饰模式模拟手机功能的升级过程:简单的手机(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 }
1 package tutorial11; 2 3 public abstract class Phone { 4 5 public void serviceCall() { 6 7 } 8 }
1 package tutorial11; 2 3 public class SimplePhone extends Phone { 4 5 public void serviceCall() { 6 System.out.println("SimplePhone:发出声音提醒主人电话来了"); 7 } 8 }
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 }
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 }
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 }
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 }
四、结果
Java截图:
2、c++结果截图