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

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");
}
}

时间: 2024-10-26 14:50:14

设计模式之策略者设计模式的相关文章

设计模式之策略模式(Strategy)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

Head First 设计模式之一 策略模式

策略模式 定义 策略模式定义了算法族,分别封装起来,让他们之间可以相互转换,此模式让算法的变化独立于使用算法的客户. 实例 上面的定义看起来说的不太清楚,记定义无意义,理解策略模式还是要看书中的鸭子例子.假设设计一个模拟鸭子的游戏,鸭子的种类有很多,有红头鸭.绿头鸭等等,鸭子可以划水,可以呱嘎叫.在这个模拟游戏的实现上,自然会想到用继承的方法,定义一个鸭子基类,具体的鸭子类型继承自鸭子基类.如下图所示 所有鸭子都会飞.呱呱叫和游泳,这些功能由基类来实现,display函数用来输出鸭子实例的类型,

JavaScript设计模式之策略模式(学习笔记)

在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选择学习策略模式. 策略模式:定义了一系列家族算法,并对每一种算法单独封装起来,让算法之间可以相互替换,独立于使用算法的客户. 通常我并不会记得“牛顿第一定律”的具体内容,所以我也难保证我会对这个定义记得多久……用FE经常见到的东西来举个例子说明一下: $("div").animation(

C++设计模式实现--策略(Strategy)模式

一. 举例说明 以前做了一个程序,程序的功能是评价几种加密算法时间,程序的使用操作不怎么变,变的是选用各种算法. 结构如下: Algorithm:抽象类,提供算法的公共接口. RSA_Algorithm:具体的RSA算法. DES_Algorithm:具体的DES算法. BASE64_Algorithm:具体的Base64算法. 在使用过程中,我只需要对外公布Algorithm_Context这个类及接口即可. 代码实现: [cpp] view plaincopy //策略类 class Alg

大话设计模式_策略模式(Java代码)

策略模式:定义算法家族,分别封装,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户 简单描述:一个父类,多个子类实现具体方法.一个Context类持有父类的引用(使用子类实例化此引用),客户端代码只需要与此Context类交互即可 大话设计模式中的截图: 例子代码: 策略类: 1 package com.longsheng.strategy; 2 3 public abstract class Strategy { 4 5 public abstract double getR

设计模式之策略模式20170720

行为型设计模式之策略模式: 一.含义 策略模式是一种比较简单的模式,也叫做政策模式,其定义如下: 定义一组算法(可抽象出接口),将每个算法都封装起来,并且使它们之间可以互换(定义一个类实现封装与算法切换) 二.代码说明 1.主要有两个角色 1)Context封装角色 它也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略,算法的直接访问,封装可能存在的变化. 2)策略角色 该类含有具体的算法 2.在用C实现过程中也是参考这种思想,以压缩,解压算法举例,具体实现如下: 1)策略模式使用场景

&lt;二&gt;读&lt;&lt;大话设计模式&gt;&gt;之策略模式

又和大家见面了,能够坚持写出第二篇文章真不错,好好加油. <<大话设计模式>>讲解策略模式是以商场收银软件程序开头的,那么问题来了,哪家商场收银软件强,开玩笑了.读过上篇文章<<简单工厂模式>>的知道,它有两个缺点:1.客户端依赖两个类,耦合性高:2.如果算法过多则需要写很多类.解决上面问题的就是策略模式了. 策略模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 商场收银软件:单价*打折算法=售价.

设计模式之策略模式(Strategy Pattern)

一.什么是策略模式(Strategy Pattern)? 从字面上理解,策略模式就是应用了某种“策略”的设计模式,而这个“策略”就是:把变化的部分封装起来. 二.举个例子 假定现在我们需要用类来描述Dog 首先,所有的Dog都有外形(比如Color),有行为(比如Run.Bark) 于是我们很自然地定义了这样一个基类Dog: public abstract class Dog { public abstract void display();//显示Dog的外形 public abstract

设计模式之策略模式C++实现

策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式UML图如下: 举例: 游泳池中有不同种类的鸭子,有绿头鸭,红头鸭,橡皮鸭,木头鸭等.不同鸭子的特征或行为不同.绿头鸭(MallardDuck)可以叫声是"quack",会飞:橡皮鸭叫声是"queak",不会飞:木头鸭不会叫,也不会飞.利用面向对象原理来设计来泳池中的各种鸭.要求:1.可扩展性好,当有新鸭加入时或鸭的行为有变动时,不用大量改动代码:2.复用性