zoukankan      html  css  js  c++  java
  • 重构之以委托取代继承

    参考《重构》

    (1)原始例子:

    <?php
    class Worker
    {
        public function inhome()
        { echo "inhome!!!".'<br>'; }
        public function eat()
        { echo "eat!!!".'<br>'; }
        public function working()
        { echo "working!!!".'<br>'; }
        public function salary()
        { echo "get salary!!!".'<br>'; }
    }    
    
    class Student extends Worker
    {
        public function gotoSchool()
        { echo "gotoSchool!!!".'<br>'; }
        public function learnKnowledge()
        { echo "learnKnowledge!!!".'<br>'; }
    }
    
    $jack = new Student();
    $jack->eat();  // 可以看到Student类只用到了Worker类的2个方法,这里是eat()
    $jack->inhome();  // 可以看到Student类只用到了Worker类的2个方法,这里是inhome()
    $jack->gotoSchool();
    $jack->learnKnowledge();
    ?>

    (2)将继承关系改变为委托

    <?php
    class Worker
    {
        public function inhome()
        { echo "inhome!!!".'<br>'; }
        public function eat()
        { echo "eat!!!".'<br>'; }
        public function working()
        { echo "working!!!".'<br>'; }
        public function getoffWork()
        { echo "getoffWork!!!".'<br>'; }
        public function salary()
        { echo "get salary!!!".'<br>'; }
    }    
    
    class Student
    {
        public function inhome($worker)  // Student类的方法inhome()是委托函数
        { $worker->inhome(); }
        public function eat($worker)  // Student类的方法eat()是委托函数
        { $worker->eat(); }
        public function gotoSchool()
        { echo "gotoSchool!!!".'<br>'; }
        public function learnKnowledge()
        { echo "learnKnowledge!!!".'<br>'; }
    }
    $work = new Worker();
    $jack = new Student();
    $jack->eat($work);
    $jack->inhome($work);
    $jack->gotoSchool();
    $jack->learnKnowledge();
    ?>

    这样子做法有些不妥之处在于需要显示的实例化两个对象,而且将其中的一个对象作为参数传给另一个对象。
    (3)继续重构

    <?php
    class Worker
    {
        public function inhome()
        { echo "inhome!!!".'<br>'; }
        public function eat()
        { echo "eat!!!".'<br>'; }
        public function working()
        { echo "working!!!".'<br>'; }
        public function getoffWork()
        { echo "getoffWork!!!".'<br>'; }
        public function salary()
        { echo "get salary!!!".'<br>'; }
    }    
    
    class Student
    {
        private $worker;
        public function __construct()
        { $this->worker = new Worker(); }
        public function inhome()  // Student类的方法inhome()是委托函数
        { $this->worker->inhome(); }
        public function eat()  // Student类的方法eat()是委托函数
        { $this->worker->eat(); }
        public function gotoSchool()
        { echo "gotoSchool!!!".'<br>'; }
        public function learnKnowledge()
        { echo "learnKnowledge!!!".'<br>'; }
    }
    $jack = new Student();
    $jack->eat($work);
    $jack->inhome($work);
    $jack->gotoSchool();
    $jack->learnKnowledge();
    ?>

    这里将Worker设置为Student的一个字段,然后在Student中设置委托函数即可。
    这样子做有利于封装,不用显示的将Worker对象当参数传进Student的委托函数中。

  • 相关阅读:
    C语言第三次博客作业单层循环结构
    C语言字符数组
    C语言第一次作业
    C语言作业函数
    C语言嵌套循环
    C语言第二次作业分支结构
    C语言作业数组
    1712新生素拓活动总结
    C语言第0次作业
    C语言作业数据类型
  • 原文地址:https://www.cnblogs.com/Robotke1/p/3264951.html
Copyright © 2011-2022 走看看