Java设计模式——策略设计模式——接口的运用

1.定义

定义一系列的算法,将这些算法分别封装起来并且可以相互替换使用,策略模式让算法独立于客户应用而独立变化。


2.代码示例

a.下面的代码遇到的问题可以用策略设计模式解决

public class Strategy
{
	public static void main(String[] args)
	{
		Move move = new Left();
		move.direction();
	}
}

abstract class Move
{
	public abstract void direction();
}

class Left extends Move
{
	public void direction()
	{
		System.out.println("向左移动");
	}
}

class Right extends Move
{
	public void direction()
	{
		System.out.println("向右移动");
	}
}

class Front extends Move
{
	public void direction()
	{
		System.out.println("向前移动");
	}
}

class Behind extends Move
{
	public void direction()
	{
		System.out.println("向后移动");
	}
}

基于上面的代码,将Left、Right、Front、Behind当作客户应用,Left客户应用现在让我们向左移动,我们已经实现了它;但是如果现在Left客户应用要我们向右移动,这时上面的方法就不可取了。我们该怎么办?很明显我们应该让客户应用与客户应用的需求独立开来,这样客户应用要什么需求我给你什么需求。策略设计模式让算法(需求)独立于客户应用而独立变化。策略设计模式怎么去实现?接口+类比对象的多态性。


b.用策略设计模式解决上述问题

public class Strategy
{
	public static void main(String[] args)
	{
		Move move = new Left(new LeftMove());
		move.direction();

		//现在Left客户应用要求实现向右移动
		Move m = new Left(new RightMove());
		m.direction();
	}
}

//接口
interface MoveAct
{
	public void direction();
}

//封装四个需求,与客户应用独立
class LeftMove implements MoveAct
{
	public void direction()
	{
		System.out.println("向左移动");
	}
}

class RightMove implements MoveAct
{
	public void direction()
	{
		System.out.println("向右移动");
	}
}

class FrontMove implements MoveAct
{
	public void direction()
	{
		System.out.println("向前移动");
	}
}

class BehindMove implements MoveAct
{
	public void direction()
	{
		System.out.println("向后移动");
	}
}


abstract class Move
{
	protected MoveAct moveAct;//接口变量

	public abstract void direction();
}

//四个客户应用
class Left extends Move
{
	public Left(MoveAct moveAct)
	{
		this.moveAct = moveAct;
	}
	public void direction()
	{
		moveAct.direction();
	}
}

class Right extends Move
{
	public Right(MoveAct moveAct)
	{
		this.moveAct = moveAct;
	}
	public void direction()
	{
		moveAct.direction();
	}
}

class Front extends Move
{
	public Front(MoveAct moveAct)
	{
		this.moveAct = moveAct;
	}
	public void direction()
	{
		moveAct.direction();
	}
}

class Behind extends Move
{
	public Behind(MoveAct moveAct)
	{
		this.moveAct = moveAct;
	}
	public void direction()
	{
		moveAct.direction();
	}
}

c.上述代码的优化

//代码优化
//代码虽然优化了,但是有点不符合现实情况
public class Strategy
{
	public static void main(String[] args)
	{
		Move move = new Left();
		move.setMoveAct(new LeftMove());
		Left left = (Left)move;
		left.direction();

		//现在Left客户应用要求实现向右移动
		move.setMoveAct(new RightMove());
		left.direction();
	}
}

//接口
interface MoveAct
{
	public void direction();
}

//封装四个需求,与客户应用独立
class LeftMove implements MoveAct
{
	public void direction()
	{
		System.out.println("向左移动");
	}
}

class RightMove implements MoveAct
{
	public void direction()
	{
		System.out.println("向右移动");
	}
}

class FrontMove implements MoveAct
{
	public void direction()
	{
		System.out.println("向前移动");
	}
}

class BehindMove implements MoveAct
{
	public void direction()
	{
		System.out.println("向后移动");
	}
}


class Move
{
	private MoveAct moveAct;//接口变量

	public void setMoveAct(MoveAct moveAct)
	{
		this.moveAct = moveAct;
	}

	public void direction()
	{
		moveAct.direction();
	}
}

//四个客户应用
class Left extends Move{}

class Right extends Move{}

class Front extends Move{}

class Behind extends Move{}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值