设计模式之---策略模式

原创 2015年11月21日 10:08:57

定义

为了使一个类拥有可能需要的有着多种实现的行为,而让这个类关联一个或多个接口对象,就是策略模式。

实现

抽象类:狗

继承类:土狗,哈巴狗,飞狗1,飞狗2,飞狗1的兄弟。

接口:飞

接口实现类:平着飞,竖着飞

 

狗是抽象类,这里并不是所有的狗都会飞,只是部分狗,所以在抽象类中,不能将飞这个方法作为抽象方法,也不能说把飞的方法直接写入飞狗类,因为会出现代码的重复(飞狗1和飞狗1的兄弟)。

 

所以这里最好的做法就是把飞这个方法做成接口,使抽象类关联该接口,再去用不同的类去实现这个接口。

类图和代码

 

package test;

abstract class Dog{
	Fly f;
	public abstract void setFly(Fly f);
	public void getFly(){
		if(f!=null){
			f.Fly();
		}
	}
}

interface Fly{
	public void Fly();
}

/**
 * 土狗 
 *
 */
class Dog1 extends Dog{
	@Override
	public void setFly(Fly f) {
		//不做任何事
	}
	
}

/**
 * 哈巴狗
 *
 */
class Dog2 extends Dog{
	@Override
	public void setFly(Fly f) {
		//不做任何事
	}
	
}

/**
 * 飞狗1
 *
 */
class FlyDog1 extends Dog{
	@Override
	public void setFly(Fly f) {
		super.f=f;
	}
	
}

/**
 * 飞狗2
 *
 */
class FlyDog2 extends Dog{
	@Override
	public void setFly(Fly f) {
		super.f=f;
	}
}

/**
 * 飞狗1的兄弟
 *
 */
class FlyDog1Brother extends Dog{
	@Override
	public void setFly(Fly f) {
		super.f=f;
	}
}

/**
 * 横着飞 
 *
 */
class fly1 implements Fly{

	@Override
	public void Fly() {
		// TODO Auto-generated method stub
		System.out.println("横着飞");
	}
	
}

/**
 * 横着飞 
 *
 */
class fly2 implements Fly{

	@Override
	public void Fly() {
		// TODO Auto-generated method stub
		System.out.println("竖着飞");
	}
	
}

public class practice {
	public static void main(String[] args) {
		//买一条飞狗
		Dog g=new FlyDog1();
		
		//它还不会飞,我先造一个飞的方法,横着飞
		Fly flyway1=new fly1();
		
		g.setFly(flyway1);
		g.getFly();//这条狗可以横着飞了
		
		//突然觉得这条横着飞的狗没意思,我再买只竖着飞的狗
		Fly flyway2=new fly2();
		g=new FlyDog2();
		g.setFly(flyway2);
		g.getFly();
		
		//亲戚给我送来了一条狗,它是横着飞的狗的兄弟,它也会横着飞
		g=new FlyDog1Brother();
		g.setFly(flyway1);//飞的方式得到了复用,提高了方法的利用率
		g.getFly();
		
	}
}


适用场景

当你不确定当前类是否需要某个方法时,而这个方法又有多种形式的时候,可以将这个方法作为接口,让当前类的抽象类关联这个接口对象,在需要用到的时候进行赋值使用。

总结

策略模式让类可以进行自由选择自己的某些特定行为,提高了灵活性,也提升了代码的复用率。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Java设计模式之策略模式

本文属于23种设计模式系列。 介绍的是策略模式。
  • jason0539
  • jason0539
  • 2015年04月13日 07:20
  • 33634

我所理解的设计模式(C++实现)——策略模式(Strategy Pattern)

每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。 而策略模式就是对算法进行包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通...
  • LCL_data
  • LCL_data
  • 2013年08月24日 10:59
  • 12673

行为型:设计模式之策略模式(十六)

俗话说:条条大路通罗马。在很多情况下,实现某个目标的途径不止一条,例如我们在外出旅游时可以选择多种不同的出行方式,如骑自行车、坐汽车、坐火车或者坐飞机,可根据实际情况(目的地、旅游预算、旅游时间等)来...
  • z742182637
  • z742182637
  • 2015年12月25日 11:15
  • 1399

设计模式—策略模式

  • 2015年12月31日 00:08
  • 1.43MB
  • 下载

Java 设计模式 策略模式

  • 2014年04月19日 17:16
  • 11KB
  • 下载

Java设计模式-策略模式

  • 2015年01月25日 01:29
  • 7KB
  • 下载

【Java设计模式】(2)策略模式Strategy

  • 2015年01月06日 09:58
  • 8KB
  • 下载

北大青鸟设计模式--策略模式

  • 2013年07月24日 08:40
  • 4.87MB
  • 下载

设计模式之PHP项目应用(策略模式:自动驾驶系统)

  • 2015年05月14日 17:53
  • 4KB
  • 下载

设计模式之PHP项目应用(策略模式:商场收银系统)

  • 2015年05月14日 16:49
  • 5KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式之---策略模式
举报原因:
原因补充:

(最多只允许输入30个字)