论坛首页 入门技术论坛

设计模式之一——策略模式及实现

浏览 2412 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-12-20  
策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

策略模式的好处在于你可以动态的改变对象的行为。
设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++z中可以用虚类),然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。下面是一个例子。


/*
这是一个表现僧人和道士的程序,僧人光头,使用棍子做武器,道士长小胡子,使用拂尘作武器
*/
package strategy;


//处理长相接口
interface LooksBehavier
{
public void display();
}

//处理所使用的武器接口
interface WeaponBehavier
{
public void useWeapon();
}
//角色基类
class Role {
public int heght;     //身高
public int sex;        //性别
public WeaponBehavier weapon;   //处理武器接口的实例
public LooksBehavier looks;     //处理长相的接口的实例
public void display()          //显示长相
{
looks.display();
}
public void weapon()          //设置所使用的武器
{
weapon.useWeapon();
}
}

//道士长相类,实现了长相接口
class TaoistBehavier implements LooksBehavier
{
public void display()    //实现接口函数
{
System.out.println("I'm a taolist with long white goatee");
}

}

//和尚长相类,实现了长相接口
class BonzeBehavier implements LooksBehavier
{
public void display()    //实现接口函数
{
System.out.println("I'm a Bonze with no hair");
}

}

//道士武器类,实现了处理武器接口
class TaoistWeapon implements WeaponBehavier
{
public void useWeapon()    //实现了处理武器接口函数
{
System.out.println("My weapon is horsetail whisk");;
}
}

//和尚武器类,实现了处理武器接口
class BonzeWeapon implements WeaponBehavier
{
public void useWeapon()    //实现了处理武器接口函数
{
System.out.println("My weapon is truncheon");;
}
}

//道士
class Taoist extends Role
{
public Taoist()
{
looks = new TaoistBehavier();
weapon = new TaoistWeapon();
}
}

//和尚
class Bonze extends Role
{
public Bonze()
{
looks = new BonzeBehavier();
weapon = new BonzeWeapon();
}
public void changeWeapon()
{
weapon = new TaoistWeapon();
                  System.out.println("change weapon");
}
}
public class RoleBase{
public static void main(String [] arg)
{
Taoist taoistObj = new Taoist();
Bonze  bonzeObj = new Bonze();
taoistObj.display();
taoistObj.weapon();
bonzeObj.display();
bonzeObj.weapon();
bonzeObj.changeWeapon();  //改变和尚使用的武器
bonzeObj.weapon();
}
}

成功执行后的输出为:
I'm a taolist with long white goatee
My weapon is horsetail whisk
I'm a Bonze with no hair
My weapon is truncheon
change weapon
My weapon is horsetail whisk
   发表时间:2008-01-21  
一句话,找到变化并封装之。
0 请登录后投票
   发表时间:2008-01-22  
设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++z中可以用虚类),然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。下面是一个例子。
楼主的上句话中的“在类中包含这个对象的实例”的类是哪个类呢。说的是不是不清楚呀。
0 请登录后投票
   发表时间:2008-03-12  
实现接口的类
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics