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