策略模式-鸭子怎么飞-实例

<?php
//接口,鸭子飞的几种不同方式 的接口
interface FlyBehavior
{
    public function fly();
}

//方式一
class FlyWithWings implements FlyBehavior
{
    public function fly()
    {
        echo "Fly With Wings \n";
    }
}
//方式2
class FlyWithNo implements FlyBehavior
{
    public function fly(){
        echo "Fly With No Wings \n";
    }
}

//鸭子类
//1、记录飞行方式
//2、做调用飞行功能的中间桥梁
class Duck
{
    private $_flyBehavior;
    public function performFly()
    {
        $this->_flyBehavior->fly();//2、做调用飞行功能的中间桥梁
    }
    public function setFlyBehavior(FlyBehavior $behavior)
    {
        $this->_flyBehavior = $behavior;//1、记录飞行方式
    }
}

class RubberDuck extends Duck
{
}

// Test Case
$duck = new RubberDuck();

/*  想让鸭子用翅膀飞行 */
$duck->setFlyBehavior(new FlyWithWings());
$duck->performFly();            

/*  想让鸭子不用翅膀飞行 */
$duck->setFlyBehavior(new FlyWithNo());
$duck->performFly();
时间: 2024-08-14 23:34:22

策略模式-鸭子怎么飞-实例的相关文章

简单工厂模式和策略模式结合使用php

策略模式是有客户端自行实例化算法类的,而简单工厂模客户端只传参数,不关心对象的生成. 结合两种模式,可以在使用策略模式的时候客户端不再生成算法的对象.修改策略模式的配置类即可. 在之前策略模式基础上,修改如下 <?php /* * 策略模式:定义一系列算法,并且把每一个算法封装起来,并且使它们可以相互替换 * 策略模式使得算法可以独立于使用它的客户而变化 */ //抽象策略接口,完成某件事情 interface category{ public function dosomething(); }

php实现设计模式之 策略模式

策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.是一种行为模式. 策略模式包含三种角色 1 抽象策略角色: 策略类,通常由一个接口或者抽象类实现. 2 具体策略角色:包装了相关的算法和行为. 3 环境角色:持有一个策略类的引用,最终给客户端调用. 举个例子:有多种排序的方法,我可以写一个排序类,每一种排序算法写一个方法,客户端调用时,知道每一种方法即可.但是新增一种算法时,或者某一种算法重写,必须修改这个算法类.当这个算法类很大

策略模式——从鸭子入手

一个鸭子类,子类有绿头鸭和红头鸭. 每个鸭子都会叫,也会游泳,所以由超类来处理这些共同的东西.而display()方法是用来显示,更加直观的体现各部分的关系. 当涉及维护时,为了复用而使用继承,问题往往更大. 如果我们在Duck类中加一个fly()飞的方法,结果会怎么样? 由于考虑不周,在Duck类中增加了fly(),这样ToyDuck玩具鸭子也继承了这个方法.可是事实上玩具鸭子是飞不起来的,那怎么办?类似的问题是,玩具鸭子只会吱吱地响,而不会向红头鸭那样呱呱的叫. 这时,我们就要用"覆盖&qu

head first 设计模式(-) 策略模式(鸭子)

目的:减少依赖 设计模式对应不同的需求,设计原则则代表永恒的灵魂,在实践中未必时刻遵守,但要时刻牢记. 1.依赖倒转原则(Dependence Inversion Principle) 2.接口隔离原则(Interface Segregation Principle) 3.里氏代换原则(Liskov Substitution Principle) 4.开闭原则(Open Close Principle) 5.迪米特法则(Demeter Principle) 6.合成复用原则(Composite

[一]Head First设计模式之【策略模式】(鸭子设计的优化历程)

public abstract class Duck { FlyBehavior flyBehavior; QuackBehavior quackBehavior; public Duck() { } public abstract void display(); public void performFly() { flyBehavior.fly(); } public void performQuack() { quackBehavior.quack(); } public void swi

实例说明策略模式

最近工作不是很多,正好抽出时间学习一下期待已经的设计模式,作为一名刚毕业一年的开发人员更应该多抽出些时间了解一下设计模式. 此片文章对策略模式做一个总结,希望对大家有帮助. (题外话:策略模式之前只是看定义和一些简单的例子,根本不明白,最后一头雾水,不过下面这个小例子还挺有趣的哦,能很好的理解到底什么是策略模式.) 一.案例 设计一个动作冒险类游戏,游戏大概是这样的:游戏中有不同的角色,每个角色战斗时使用的武器不同.现有两个角色:骑士(Knight)和巨魔头(Troll),Knight的武器是宝

对设计模式的总结之简单工厂与策略模式

前言 面向对象编程追求的本质-提高扩展性.可维护性.灵活性和复用性.合理利用面向对象6个原则,能够很好的达到要求.如何利用好就是至关重要的了,前人总结了23+个设计模式能够让初学者更容易学到其中的精髓,本文就说说我对本人对简单工厂模式.策略模式的见解. 简单工厂模式与策略模式 简单工厂模式 工作中,常常遇到需要做一个功能(鸭子),这个功能中含有可控个数的子操作功能(鸭子叫,鸭子跑,鸭子飞),而且子功能在不同的情况下处理方式又不相同(成年鸭子/小鸭子叫,成年鸭子/小鸭子跑,成年鸭子/小鸭子飞).我

策略模式——HeadFirst 设计模式学习笔记

策略模式:策略模式定义了算法族,分别封装起来,让他们可以相互替换,此模式让算法的变化独立于使用算法的客户. 设计原则: 找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起.以便以后轻松的更改或扩充此部分,而不影响不需要变化的其他部分 针对接口编程而不是针对实现编程.实际的实现不会被绑定,调用时只知道调用的接口,而无需知道具体的实现方式 多用组合,少用继承.使用组合有很大的弹性,可以在运行时动态改变行为 要点: 良好的OO设计必须遵循可复用,可拓展,可维护 大部分模式允

设计模式(一) 策略模式

 一  入门 摘自<Head First Design Patterns> chapter 1 1  飞翔的鸭子 开发一款模拟鸭子的游戏.首先设计一个鸭子母类,里面有鸭子的叫声.游泳和外形三个成员函数,然后在野鸭和红头鸭两个子类中重写继承的外形函数. 更进一步,要求鸭子会飞,应该如何设计程序呢? 2  两种方法 1)  继承 为 Duck 母类添加 fly() 成员函数,然后各个子类继承 fly() 问题: 并不是所有的鸭子都会飞,比如“煮熟的鸭子”.解决: 不会飞的鸭子自母类继承 fly()