设计模式之策略者设计模式

author author     2022-08-13     144

关键词:

package net.dp.strategy;

import net.dp.strategy.fly.FlyBehavior;
import net.dp.strategy.quack.QuackBehavior;

/**
* 策略者模式 鸭子父类
* @author Administrator
*
*/
public abstract class Duck {
//鸭子有可能具备飞行行为和叫喊行为 但是具体的行为不知道 所以父类中使用了这两个接口作为成员变量 由子类继承 再具体确定如何飞行和叫喊
//这个时候就需要接口来体现了。。并且接口有特定的实现类 由子类继承
protected FlyBehavior flyBehavior;
protected QuackBehavior quackBehavior;

//这个已经确定鸭子都具备的行为 所以直接使用抽象方法即可。。
public abstract void display();

/*
* 具体如何飞
*/
public void performFly(){
flyBehavior.fly();
}


/*
* 具体如何叫
*/
public void performQuack(){
quackBehavior.quack();
}

/*
* 鸭子都会游泳 所以已经确定了
*/
public void swim(){
System.out.println("All ducks float, even decoys!");
}

public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}

public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}

 

package net.dp.strategy;

import net.dp.strategy.fly.FlyNoWay;
import net.dp.strategy.fly.FlyWithWings;
import net.dp.strategy.quack.MuteQuack;
import net.dp.strategy.quack.Squeak;

public class ADuck extends Duck {
public ADuck() {
flyBehavior = new FlyWithWings();
quackBehavior = new Squeak();
}

public void display() {
System.out.println("I‘m a duck model.");
}

public void changeBehavior() {
setFlyBehavior(new FlyNoWay());
setQuackBehavior(new MuteQuack());
}

public static void main(String[] args) {
ADuck aDuck = new ADuck();
aDuck.display();
aDuck.swim();
aDuck.performFly();
aDuck.performQuack();
aDuck.changeBehavior();
aDuck.performFly();
aDuck.performQuack();
}
}

 

package net.dp.strategy;

import net.dp.strategy.fly.FlyWithWings;
import net.dp.strategy.quack.MuteQuack;

public class MyDuck extends Duck{

@Override
public void display() {
System.out.println("I am mcdola Duck");
}
/*
* 这是一只会飞但不能叫的鸭子
*/
public MyDuck()
{
flyBehavior=new FlyWithWings();
quackBehavior=new MuteQuack();
}


public static void main(String[] args) {
MyDuck md=new MyDuck();
md.display();
md.performFly();
md.performQuack();
}
}

 

package net.dp.strategy.fly;

/**
* 飞行行为接口
* @author Administrator
*
*/
public interface FlyBehavior {
void fly();
}

 

package net.dp.strategy.fly;

/**
* 飞行的一个特定实现类:无法飞行
* @author Administrator
*
*/
public class FlyNoWay implements FlyBehavior{
public void fly(){
System.out.println("I can‘t fly.");
}
}

 

package net.dp.strategy.fly;

/**
* 特定的飞行实现类 有翅膀的飞行 实现FlyBehavior接口 不然某个鸭子类直接实现接口的原因是代码无法复用
* @author Administrator
*
*/
public class FlyWithWings implements FlyBehavior {
public void fly() {
System.out.println("I‘m flying and with wings!");
}
}

 

package net.dp.strategy.quack;


/*
* 没有叫喊
*/
public class MuteQuack implements QuackBehavior{
public void quack(){
System.out.println("<<Silence>>");
}
}

 

package net.dp.strategy.quack;
/**
* 普通叫喊实现类
* @author Administrator
*
*/
public class Quack implements QuackBehavior{

public void quack(){
System.out.println("quack");
}
}

 

package net.dp.strategy.quack;

/**
* 叫喊接口
* @author Administrator
*
*/
public interface QuackBehavior {
void quack();
}

 

package net.dp.strategy.quack;


/*
* 另一种叫喊方式
*/
public class Squeak implements QuackBehavior{
public void quack(){
System.out.println("Squeak");
}
}

 

设计模式之策略模式与责任链模式详解和应用(代码片段)

目录1.策略模式1.1目标1.2.内容定位1.3.定义1.4.应用场景1.5.促销优惠业务场景1.6用策略模式实现选择支付方式的业务场景1.7策略模式在框架源码中的体现1.8策略模式的优缺点2责任链模式2.1责任链楼式的应用场景2.2利用责任链模式... 查看详情

设计模式-策略者模式

一、定义   策略模式是针对一组算法,将每个算法封装到具有公共接口的独立的类中,从而使它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。 二、UML类图 三、例子展示namespace... 查看详情

策略者模式

 1.策略模式定义和优点   策略者模式: 定义一系列的算法把它们一个个封装起来并使他们可以相互替换。优点:    A)策略模式利用组合委托等思想有效避免很多if条件语句。    B)策略模式提供了开... 查看详情

20.设计模式_策略者模式

一、引言   前面主题介绍的状态模式是对某个对象状态的抽象,而本文要介绍的策略模式也就是对策略进行抽象,策略的意思就是方法,所以也就是对方法的抽象,下面具体分享下我对策略模式的理解。二、策略者模式介... 查看详情

策略者模式小示例

//策略者模式/**类名:Tactics说明:策略者类,根据需要添加新的数据格式,只需要定义一个新的类名(比如HtmlData),方法名(getData)不变,将该方法的具体内容实现即可*/classTactics//示例数组protected$demoList;publicfunction__construct()/... 查看详情

设计模式

一、设计模式之装饰者模式二、设计模式之建造者模式三、设计模式之工厂模式四、设计模式之构造函数模式五、设计模式之单例模式六、设计模式之原型模式七、设计模式之外观模式八、设计模式之组合模式九、设计模式之享... 查看详情

工厂模式策略者模式责任链模式综合应用(代码片段)

设计模式的具体运用:  简单工厂模式、策略者模式、责任链模式定义与使用classLoader的具体运用  自定义的classloader来动态加载类程序功能设计:  在商城购物时,商城可能会在特殊的日子、或者依据会员等级,对结算... 查看详情

设计模式之建造者模式

相关文章设计模式之设计六大原则设计模式之单例模式的七种写法1.建造者模式简介定义建造者模式(builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。简介建造者模式(builder)是创... 查看详情

设计模式之————建造者模式

建造者模式1.什么是建造者模式?建造者模式属于创造型模式,它是将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。举例:普通房子和高楼,两者都很难建造,但也有相似点:打地... 查看详情

设计模式之装饰者设计模式(代码片段)

设计模式之装饰者设计模式1.定义:动态的将责任附加到对象上。想要扩展功能,装饰者是有别于继承的另外一种选择。就增加功能而言,装饰者模式比子类更加的灵活涉及到的设计原则:类应该对扩展开放,对修改关闭要点:1.... 查看详情

设计模式之建造者模式(代码片段)

设计模式之建造者模式  建造者模式(BuilderPattern)也叫生成器模式,定义:Separatetheconstructionofcomplexobjectfromitsrepresentationsothatthesameconstructionprocesscancreatedifferentrepresentations.(将一个复杂的对象的构建与它的表示 查看详情

设计模式之建造者模式

1定义建造者模式(BuilderPatten):将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式用于一步一步创建一个复杂的对象,他允许用户只通过指定复杂对象的类型和内容进行构建,用户... 查看详情

设计模式之装饰者模式

一.装饰者模式特点:1.装饰者和被装饰者对象有相同的超类2.可以用一个或多个装饰者包装一个对象3.由于装饰者和被装饰者具有相同超类,所以任何需要被包装对象的场合,可以用装饰过的对象代替4.装饰者可以再所委托被装饰... 查看详情

java设计模式系列之装饰者模式

装饰者模式的定义动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案 装饰者模式的UML类图 查看详情

设计模式之建造者模式

...它的表示分离,使同样的构建过程可以创建不同的表示的设计模式;classProduct{private$_parts;publicfunction__construct(){$this->_parts=array();}publicfunctionadd($part){returnarray_push($this->_parts 查看详情

设计模式之建造者模式(创建型)(代码片段)

模式定义建造者模式属于23种设计模式中的创建型模式,可以理解为创建对象的一种很好的方法。所谓建造者模式就是将组件和组件的组件过程分开,然后一步一步建造一个复杂的对象。所以建造者模式又叫生成器模式。建造者... 查看详情

设计模式之装饰者模式

设计模式之装饰着模式    装饰者模式其实就是为了增强类,增强类的要素      a.增强类必须实现被增强类的接口      b.增强类中必须含有被增强类的应用  创建一个手机接口(Phone)  /**创建一个手机... 查看详情

设计模式之装饰者模式(代码片段)

目录 装饰者模式介绍路边摊事例路边摊类图路边摊实现FoodEggCakeChineseHamburgerOriginalMaterialEggTenderloinHamSausageChineseHamburgerTest装饰者模式介绍装饰者模式动态的将责任附加到对象身上。想要拓展功能,装饰者提供有别于继承的另... 查看详情