资讯专栏INFORMATION COLUMN

适配器设计模式(应用于活动业务)

sunnyxd / 343人阅读

摘要:适配器的适用场景代码的复用性强。客户端使用目标接口,与和目标接口一致的对象合作。被适配者一个现存需要适配的接口。适配器负责将的接口转换为的接口。适配器是一个具体的类,这是该模式的核心。适配器分为类适配器和对象适配器两种,下面将详细讲述。

适配器的适用场景

代码的复用性强。

我们一直在使用适配器,如果 只有USB连接头,无法将手机插到标准的插座上面充电 ,这时需要的一个适配器,一端接USB连接头,另一端接插座

活动专题,例抽奖,固定的规则是充值有抽奖机会,但是突然来了一个需求说充值还要分享才能有抽奖机会,这时可以运用上这个设计模式

案例一(来自于php 设计模式 书) - 假设一个企业网站同时销售软件服务和软件产品,目前所有的交易都在美国进行,后续业务决定向欧洲发展要增加货币换算(增加适配器)

案例二是自已设计于活动专题业务上,只是将逻辑摘取出来,代码不可直接运行

优点

灵活性扩展性都很好

将目标类和适配者类解耦

适配器所涉及的角色包括下面几种:

目标(Target):定义一个客户端使用的特定接口。
客户端(Client):使用目标接口,与和目标接口一致的对象合作。
被适配者(Adaptee):一个现存需要适配的接口。
适配器(Adapter):负责将Adaptee的接口转换为Target的接口。适配器是一个具体的类,这是该模式的核心。
适配器分为类适配器和对象适配器两种,下面将详细讲述。

案例一

来自 php 设计模式 一书的适配器设计模式案例**

/**
 * EuroCalc.php
 * 美元 - 能累加购买的服务和产品的价格 来自于php 设计模式
 */
class DollarCalc {
    private $dollar;
    private $product;
    private $service;
    public $rate = 1;

    public function requestCalc($productNow,$serviceNow) {
        $this->product = $productNow;
        $this->service = $serviceNow;
        $this->dollar = $this->product + $this->service;
        return $this->requestCount();
    }

    private function requestCount() {
        $this->dollar *= $this->rate;
        return $this->dollar;
    }
}


/**
 * EuroCalc.php
 * 欧元 -  能累加购买的服务和产品的价格
 */
class EuroCalc {
    private $euro;
    private $product;
    private $service;
    public $rate = 1;

    public function requestCalc($productNow,$serviceNow) {
        $this->product = $productNow;
        $this->service = $serviceNow;
        $this->euro = $this->product + $this->service;
        return $this->requestCount();
    }

    private function requestCount() {
        $this->euro *= $this->rate;
        return $this->euro;
    }
}
/**
 * 接口 ITarget.php
 */
interface ITarget {
    function requester();
}
/**
 * 例:找一个合适的适配器来适合欧洲的插座一样,以下就是创建这个适配器
 * EuroAdapter 实现了一个接口又扩展了一个类
 */

class EuroAdapter extends EuroCalc implements ITarget {
    public function __construct() {
        $this->requester();
    }
    public function requester() {
        $this->rate = 0.8111;
        return $this->rate;
    }
}
/**
 * 用户
 */
class Client {
    private $euroRequest;
    private $dollarRequest;
    public function __construct() {
        $this->euroRequest = new EuroAdapter();
        $this->dollarRequest = new DollarCalc();

        $euros = "€";
        echo "Euros:$euros".$this->makeAdapterRequest($this->euroRequest)."
"; echo "dollar:".$this->makeDollarRequest($this->dollarRequest); } public function makeAdapterRequest(ITarget $req) { return $req->requestCalc(40,50); } public function makeDollarRequest(DollarCalc $req) { return $req->requestCalc(40,50); } } $worker = new Client();
案例二 个人运用于自动化活动专题的接口设计

抽奖例子(代码只显示对应的设计逻辑部分)

hd_info = ""; 
    }
    public function _lottery()
    {
        // 实例
        $lottery = new LotteryAdapter($hd_info);
        // 取得抽奖结果
        $rs      = $lottery->_getLotteryResult();
        return $rs;
    }

}

namespace controller;

use btsApp as BaseApp;
/**
 * 
 */
class LotteryAdapter extends AutoLottery implements ILottery
{
    public function __construct($hd_info) {
        // 后台配置是否需要使用适配器
        if($hd_info["use_adapter"] === true) {
            $adapter_name = $hd_info["adapter_name"];
            // $adapter_name = "adapter_name"; test
            $this->$adapter_name();
        }
        
    }
    /**
     * adapter_name 该活动对应的适配器
     */
    private function adapter_name()
    {
        // 假设不符合自动化的需求条件是必须进入游戏后5分才可抽奖,增加适配器的该内容即可,从而不用重写整个抽奖活动
        $game_info = App::$app->model()->checkEnterGameInfo();
        if(strtotime($info["TIME"]) - time() < 300) {
            $this->adapter_status = false;
            $this->adapter_code   = -51;
        }
    }
}

namespace controller;

use btsApp as BaseApp;
/**
 * 自动化抽奖接口的基类
 */
class AutoLottery {
     // 多带带开发条件的状态
    public $adapter_status = true;
    public $adapter_code = 0;
    public function _getLotteryResult(){
        
        
        //  最后判断适配器的状态
        if(!$this->adapter_status) {
            App::jetJsonpOutput($this->adapter_return_code);
        }

        // 业务逻辑判断
        
        // 通过则将数据入库
        $rs_status = App::$app->model()->insert($rs);
       
        // 返回结果
        return $rs;
    }
}
?>

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22579.html

相关文章

  • 2021年9月国产数据库大事记

    .markdown-body{word-break:break-word;line-height:1.75;font-weight:400;font-size:15px;overflow-x:hidden;color:#333}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body...

    suemi 评论0 收藏0
  • 2021年10月国产数据库大事记

    摘要:月日消息,近日,中国信息通信研究院大数据产品能力评测数据库方向的测评结果陆续出炉。月日消息,国家工业信息安全发展研究中心发布电信行业数据库产品第一期测评结果,前三名分别是阿里云数据库柏睿数据企业级交易型数据库信创版云和恩墨企业级数据库。 .markdown-body{word-break:break-word;line-height:1.75;font-weight:400;font-si...

    elva 评论0 收藏0
  • 用友助力山东企业上云

    摘要:用友网络山东区作为推动山东企业上云的主力服务商,参展了此次活动。用友云,是用友时期的核心产品,致力于以平台模式为企业提供社会化云服务助力企业数字化转型。用友云帮助企业实现敏经营轻管理易金融简,从而最终实现增长收入降低成本提高效率控制风险。3月7日上午,由济南市经信委、市财政局与高新区机关党委主办的云行齐鲁之济南站暨高新区创新论坛在济南禧悦东方酒店顺利召开。本次活动是今年企业上云第一次重大活动...

    shery 评论0 收藏0
  • 【附PPT下载】UCan技术开放日·上海站活动回顾

    摘要:扫描下方二维码可观看视频回放,获取讲师合集活动回顾来自技术中台研发部的安雪艳介绍了基于打造的技术平台。未来英特尔将与一起,共同利用并发挥云原生的价值,为处在数字化型中的用户,提供更加丰富的云化策略。 ...

    番茄西红柿 评论0 收藏2637
  • 【附PPT下载】UCan技术开放日·上海站活动回顾

    摘要:徐亮厚称,当前云原生已成为业务发展的一个重要引擎,年疫情更是加大了对的需求,拉动了大数据数据库中间件人工智能的云原生化发展。未来英特尔将与一起,共同利用并发挥云原生的价值,为处在数字化型中的用户,提供更加丰富的云化策略。 9月11日,由UCloud优刻得主办的UCan技术开放日活动上,以构建云原生,拥抱新增长为主题,UCloud携手达达集团、驭势科技、企源科技以及英特尔等企业的云原生技术专...

    levy9527 评论0 收藏0

发表评论

0条评论

sunnyxd

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<