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

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

    类图

    java

    package rjsj.no11;
    
    public class Client {
        public static void main(String[] args) {
            CellPhone phone1 = new SimplePhone();
            CellPhone phone2 = new JarPhone(phone1);
            CellPhone phone3 = new ComplexPhone(phone2);
            phone1.receiveCall();
            System.out.println("********************************************************************************");
            phone2.receiveCall();
            System.out.println("********************************************************************************");
            phone3.receiveCall();
        }
    }
    package rjsj.no11;
    
    public class ComplexPhone extends PhoneDecorator{
        public ComplexPhone(CellPhone cellPhone) {
            super(cellPhone);
        }
    
        @Override
        public void receiveCall() {
            super.receiveCall();
            System.out.println("闪光灯闪烁");
        }
    }
    package rjsj.no11;
    
    public class JarPhone extends PhoneDecorator{
        public JarPhone(CellPhone cellPhone) {
            super(cellPhone);
        }
    
        @Override
        public void receiveCall() {
            super.receiveCall();
            System.out.println("发出震动");
        }
    }
    package rjsj.no11;
    
    public class PhoneDecorator extends CellPhone{
    
        private CellPhone cellPhone = null;
    
        public PhoneDecorator(CellPhone cellPhone){
            if (cellPhone != null){
                this.cellPhone = cellPhone;
            } else {
                this.cellPhone = new SimplePhone();
            }
        }
    
        @Override
        public void receiveCall() {
            cellPhone.receiveCall();
        }
    }
    package rjsj.no11;
    
    public class SimplePhone extends CellPhone{
        @Override
        public void receiveCall() {
            System.out.println("发出声音");
        }
    }
    package rjsj.no11;
    
    abstract class CellPhone {
        public abstract void receiveCall();
    }

    C++

    #include <iostream>
    using namespace std;
    
    class Phone{
    public:
        virtual void receiveCall(){};
    };
    
    class PhoneDecorator:public Phone {
    protected:
        Phone *phone;
    
    public:
        PhoneDecorator(Phone *p){
            phone=p;
        }
        virtual void receiveCall(){
            phone->receiveCall();
        }
    };
    
    class SimplePhone:public Phone{
    public:
        virtual void receiveCall(){
            cout<<"发出声音"<<endl;
        }
    };
    
    
    class JarPhone:public PhoneDecorator{
    public:
        JarPhone(Phone *p):PhoneDecorator(p){}
        void receiveCall(){
            phone->receiveCall();
            cout<<"震动"<<endl;
        }
    };
    
    class ComplexPhone:public PhoneDecorator{
    public:
        ComplexPhone(Phone *p):PhoneDecorator(p){}
        void receiveCall(){
            phone->receiveCall();
            cout<<"闪光灯"<<endl;
        }
    };
    
    int main(){
        Phone *p1=new SimplePhone();
        p1->receiveCall();
        cout<<"Jarphone"<<endl;
        Phone *p2=new JarPhone(p1);
        p2->receiveCall();
        cout<<"ComplexPhone"<<endl;
        Phone *p3=new ComplexPhone(p2);
        p3->receiveCall();
        return 0;
    }

    运行截图:

  • 相关阅读:
    Android ADB的一些用法
    我想搞个python版的http代理服务器出来
    用Python创建大文件
    串口号都属于“使用中”的解决方法
    wxPython入门(二)
    Android Studio安装后不能启动的解决办法
    STC单片机不需要按电源开关下载的方法!
    最近要做的一些事情
    关于“用香蕉弹琴”的一点解释
    stc15系列单片机ISP编程失败率是相当高啊!
  • 原文地址:https://www.cnblogs.com/Arisf/p/15685631.html
Copyright © 2011-2022 走看看