• 设计模式之适配器模式


    适配器模式的定义:将某个对象的接口转换为客户希望的另外一个接口。(四人组的设计模式一书)

    通俗的说就是:我需要某个对象,但是这个对象是没法直接获得的。可是系统中存在的类似的东西。

    这个时候我们就可以用继承或者是实现接口的方式创建一个新的类,创建这个类的实例满足我们的需求。

    这样就可以避免去修改系统中的代码。符合面向对象5原则中的开发封闭原则



    信号-显卡-显示器

    /**
        二进制信号
        signal
    **/
    class Signal
    {
        public function processing()
        {
            echo "base signal processing";
        }
    }
    





    显示器需要接受信号,可是它没办法处理二进制信号
    怎么办?
    两种解决办法:
        1 修改signal类 添加新的方法,
        2 创建一个adapter类让它出来二进制信号。


    方法一

    class Signal1
    {
        public function processing()
        {
            echo " base signal processing ";
        }
    
    
        public function processingBinary()
        {
            $this->processing();
            echo " binary signal processing ";
        }
    }
    /**
     显示器
    **/
    class Monitor1
    {
        protected $signal = null;
    
    
        public function __construct($signal)
        {
            $this->signal = $signal;
        }
        /**
            显示图像
        **/
        public function show()
        {
            if(empty( $this->signal) || !( $this->signal instanceof Signal1) ){
                echo " no signal ";
            } else{
                 $this->signal->processingBinary();
                echo " show singal on the screen ";
            }
        }
    }
    
    
    $monitor = new Monitor1(new Signal1());
    $monitor->show();



    方法二

    class SignalAdapter extends Signal
    {
        public function processing()
        {
            parent::processing();
            echo "base signal processing";
        }
    }
    
    
    /**
     显示器
    **/
    class Monitor
    {
        protected $signal = null;
    
    
        public function __construct($signal)
        {
            $this->signal = $signal;
        }
        /**
            显示图像
        **/
        public function show()
        {
            if(empty($this->signal) || !($this->signal instanceof Signal) ){
                echo " no signal";
            } else{
                $this->signal->processing();
                echo " show singal on the screen";
            }
        }
    }
    $monitor = new Monitor(new SignalAdapter());
    $monitor->show();




    方法一缺点:

    旧的方法可能正在被使用,比较好的办法是添加新的方法,违背了面向设计的原则,会造成重复。
                    不够灵活,不利于扩展,假如当我们要添加新信号处理的时候又要去修改signal类
       优点:

    简单方便

    方法二缺点:

    需要建造新的类,增加代码的复杂度,繁琐

    优点:

      灵活,利于扩展







  • 相关阅读:
    重复打印文件首行n次
    考PMP证书总结
    @click @dblclick @keyup 等事件不起作用
    element-ui table 表格内出现一根横线???
    windows 鼠标拖动应用顶部移动 , 向下还原 , 自动最大化的设置
    【.NET】使用 XmlDocument 查找带命名空间的节点
    【WinForms】DataGridView自动调整列宽度以及最后一列宽度填充
    时间返回格式统一处理的几种办法
    hexo使用
    hexo搭建个人博客网站
  • 原文地址:https://www.cnblogs.com/riskyer/p/3271416.html
Copyright © 2020-2023  润新知