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;
    }

    运行截图:

  • 相关阅读:
    Spark Scala 读取GBK文件的方法
    Mac OS X 系统下自带的文本文件格式转换工具iconv
    报到
    java 字符串中含有双引号" "与单引号' '问题
    div1嵌套div2,div2居中的解决办法
    ionic4 创建 angular项目 ReactNative下载第三方库出错解决Error: EPERM: operation not permitted, rename
    ionic+cordova 创建项目+打包
    jxl读取excel文件异常:Unable to recognize OLE stream 的解决方法
    学习 javascript (一)javascript 简介
    学习 JavaScript (四)核心概念:操作符
  • 原文地址:https://www.cnblogs.com/Arisf/p/15685631.html
Copyright © 2011-2022 走看看