Java设计模式--策略模式

Java设计模式–策略模式

  • 定义
    定义了算法族,分别封装起来,让他们之间可以互相替换,此模式的变化独立于算法的使用者

  • **实现 **
    虚假的实现
    第一步,代码的初步实现

public class ZombieTest {
	public static void main(String[] args) {
		AbstractZombie normalZombie = new NormalZombie();
		AbstractZombie flagZombie = new FlagZombie();
		
		normalZombie.display();
		normalZombie.move();
		normalZombie.attack();
		
		System.out.println("-------------------");
		
		flagZombie.display();
		flagZombie.move();
		flagZombie.attack();
	}
}
abstract class AbstractZombie{
	public abstract void display();
	public void attack() {
		System.out.println("咬。。。。");
	}
	public void move() {
		System.out.println("一步一步移动。。。");
	}
}
class NormalZombie extends AbstractZombie{

	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("我是普通僵尸");
	}
	
}
class FlagZombie extends AbstractZombie{

	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("我是旗手僵尸");
	}
	
}

业务拓展,增加新的僵尸

public class ZombieTest {
	public static void main(String[] args) {
		AbstractZombie normalZombie = new NormalZombie();
		AbstractZombie flagZombie = new FlagZombie();
		
		normalZombie.display();
		normalZombie.move();
		normalZombie.attack();
		
		System.out.println("-------------------");
		
		flagZombie.display();
		flagZombie.move();
		flagZombie.attack();
	}
}
abstract class AbstractZombie{
	public abstract void display();
	public void attack() {
		System.out.println("咬。。。。");
	}
	public void move() {
		System.out.println("一步一步移动。。。");
	}
}
class NormalZombie extends AbstractZombie{

	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("我是普通僵尸");
	}
	
}
class FlagZombie extends AbstractZombie{

	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("我是旗手僵尸");
	}
	
}
class BigHeadZombie extends AbstractZombie{

	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("大头。。。。");
	}

	@Override
	public void attack() {
		// TODO Auto-generated method stub
		//加特技
		System.out.println("头撞。。。。。");
	}
	
}
class XxxZombie extends BigHeadZombie{

	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("xxxxxxxxxxx");
	}

	@Override
	public void attack() {
		// TODO Auto-generated method stub
		System.out.println("xxxxxxxxxxxx");
	}
	
}
//更多

写到这里,我们发现如果我们增加跟多僵尸,当他们有更多的能力时,其实扩展性并不强,这也是新手经常犯的问题
真正的实现

package 策略模式;

public class StrategyTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Zombie zombie=new NormalZomble();
		zombie.display();
		zombie.attack();
		zombie.move();
		zombie.setAttackable(new HitAttack());
		zombie.attack();
		Zombie zombie2=new FlagZomble();
		zombie2.display();
		zombie2.attack();
		zombie2.move();
	}
	
}
interface Moveable{
	void move();
}
interface Attackable{
	void attack();
}
abstract class Zombie implements Moveable,Attackable{
	abstract public void display();
	Moveable moveable;
	Attackable attackable;
	
	public Zombie(Moveable moveable, Attackable attackable) {
		super();
		this.moveable = moveable;
		this.attackable = attackable;
	}
	
	public abstract void move();
	public abstract void attack();
	public Moveable getMoveable() {
		return moveable;
	}
	public void setMoveable(Moveable moveable) {
		this.moveable = moveable;
	}
	public Attackable getAttackable() {
		return attackable;
	}
	public void setAttackable(Attackable attackable) {
		this.attackable = attackable;
	}
	
}
class StepByStep implements Moveable{

	@Override
	public void move() {
		// TODO Auto-generated method stub
		System.out.println("一步一步移动。。。。");
	}
	
}
class  BiteAttack implements Attackable{

	@Override
	public void attack() {
		// TODO Auto-generated method stub
		System.out.println("咬。。。");
	}
	
}
class NormalZomble extends Zombie{
	public NormalZomble() {
		super(new StepByStep(),new BiteAttack());
	}
	public NormalZomble(Moveable moveable, Attackable attackable) {
		super(moveable, attackable);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("我是普通僵尸");
	}

	@Override
	public void move() {
		// TODO Auto-generated method stub
		moveable.move();
	}

	@Override
	public void attack() {
		// TODO Auto-generated method stub
		attackable.attack();
	}
	
}
class FlagZomble extends Zombie{
	public FlagZomble() {
		super(new StepByStep(), new BiteAttack());
	}
	public FlagZomble(Moveable moveable, Attackable attackable) {
		super(moveable, attackable);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("我是旗手僵尸。。。。");
	}

	@Override
	public void move() {
		// TODO Auto-generated method stub
		moveable.move();
	}

	@Override
	public void attack() {
		// TODO Auto-generated method stub
		attackable.attack();
	}
	
}
class HitAttack implements Attackable{

	@Override
	public void attack() {
		// TODO Auto-generated method stub
		System.out.println("打。。。。。。");
	}
	
}

  • 应用场景
    一些游戏的开发

  • 优点
    方便新功能的加入

  • 源码的应用
    java.util.comparable

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值