/* 策略模式(Strategy)
* 组成:
* --抽象策略角色:策略类,通常由一个接口或者抽象类实现
* --具体策略角色:包装了算法行为
* --环境角色:持有一个策略类的引用,最终给客户端调用。
* 意义:
* --可以使开发人员开发出许多可以替换的部分组成的软件,并且各个部分之间是弱连接关系。
* --弱连接特性使软件有更强扩展性。
* 缺点:
* 1、客户端必须知道所有的策略类,并自行决定使用哪个策略类。
* 2、造成很多策略类
* 解决方法:
* --采用工厂方法解决一定程度上的缺点
*
* 编写步骤:
* 1、编写抽象策略角色接口,对策略对象定义一个公共接口。
* 2、编写具体策略角色类,该类实现了上面的公共接口。
* 3、编写环境角色类,在使用策略对象的类中保存一个对策略类对象的引用。
* 在此类中实现对策略对象引用的set和 get方法。或者使用构造方法完成赋值
*/
计算器
public class AddStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
return a+b;
}
}
public class SubStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
// TODO Auto-generated method stub
return a-b;
}
}
public class Environment {
private Strategy strategy;
public Environment(Strategy strategy){
this.strategy=strategy;
}
public int calculate(int a, int b){
return strategy.calculate(a, b);
}
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
}
public class Test {
public static void main(String[] args) {
Strategy s=new AddStrategy();
Environment e=new Environment(s);
System.out.println(e.calculate(1, 2));
e.setStrategy(new SubStrategy());
System.out.println(e.calculate(1, 2));
}
}
对人员进行排序
public interface Strategy{
public void sort(List<Person> list);
}
//具体角色类
public class OrderIdStrategy implements Strategy {
@Override
public void sort(List<Person> list) {
Collections.sort(list,new Comparator<Person>(){
public int compare(Person p1, Person p2) {
return p2.getId()<p1.getId() ? -1 : (p2.getId()>(p1.getId()) ? 1 : 0);
}
});
}
}
//具体角色类
public class OrderAgeStrategy implements Strategy{
@Override
public void sort(List<Person> list) {
Collections.sort(list,new Comparator<Person>(){
public int compare(Person p1, Person p2) {
return p2.getAge()<p1.getAge() ? -1 : (p2.getAge()>(p1.getAge()) ? 1 : 0);
}
});
}
}
public class Person {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
...
}
//环境角色类
public class Environment {
private Strategy strategy;
public Environment(Strategy strategy){
this.strategy=strategy;
}
public void sort(List<Person> list){
strategy.sort(list);
}
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
}
public class Test {
public static void main(String[] args) {
Person p1=new Person();
p1.setId(1);
p1.setAge(18);
p1.setName("张三");
Person p2=new Person();
p2.setId(2);
p2.setAge(29);
p2.setName("李四");
Person p3=new Person();
p3.setId(3);
p3.setAge(19);
p3.setName("王五");
Person p4=new Person();
p4.setId(4);
p4.setAge(18);
p4.setName("赵六");
Person p5=new Person();
p5.setId(5);
p5.setAge(17);
p5.setName("路七");
List<Person> list = new ArrayList<Person>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
Strategy s=new OrderIdStrategy();
Environment e=new Environment(s);
e.sort(list);
Iterator iterator=list.iterator();
while(iterator.hasNext()){
Person p=(Person)iterator.next();
System.out.println("Name:"+p.getName()+" ID:"+p.getId()+" Age:"+p.getAge());
}
System.out.println("====================华丽丽的分割线====================");
e.setStrategy(new OrderAgeStrategy());
e.sort(list);
iterator=list.iterator();
while(iterator.hasNext()){
Person p=(Person)iterator.next();
System.out.println("Name:"+p.getName()+" ID:"+p.getId()+" Age:"+p.getAge());
}
}
}
各种狗以及各种叫声
public interface Brak {
public void brak();
}
策略具体角色类
public class BrakNoWay implements Brak {
@Override
public void brak() {
System.out.println("我不会叫");
}
}
策略具体角色类
public class BrakWithMicrophone implements Brak {
@Override
public void brak() {
System.out.println("我用扩音器叫");
}
}
策略具体角色类
public class BrakWithWang implements Brak{
@Override
public void brak() {
System.out.println("我会旺旺叫");
}
}
环境角色类
public abstract class Dog {
Brak brak;
public void getBrak() {
brak.brak();
}
public void setBrak(Brak brak) {
this.brak = brak;
}
public abstract void display();
}
public class BlackDog extends Dog {
public BlackDog() {
brak = new BrakWithWang();
}
@Override
public void display() {
System.out.println("我是一只小黑狗");
}
}
public class ToyDog extends Dog {
public ToyDog() {
brak = new BrakWithMicrophone();
}
@Override
public void display() {
System.out.println("我是一只玩具狗");
}
}
public class Test {
public static void main(String[] args) {
Dog dog = new ToyDog();
dog.display();
dog.getBrak();
dog.setBrak(new BrakWithWang());
dog.getBrak();
Dog dog2 = new BlackDog();
dog2.display();
dog2.getBrak();
}
}