java设计模式之策略模式

①UML设计:

②定义以及使用场景:定义一系列算法,将每个算法单独封装,使之可以相互替换,具体方法策略的选择由客户端决定,一般适用于多选一的场景。

③示例:定义一个接口Message,定义两个类QQ、WX 都实现了Message接口,定义一个类MessageController,消息控制中心,决定执行Message接口下的哪个具体实现类。

public interface Message{
   void send(String message,String from);
}
public class QQ implements Message{
   @Override
   public void send(String message,String from){
   System.out.println("QQ message "+ message + " from" + from+ "!");
 }
}
public class WX implements Message{
   @Override
   public void send(String message,String from){
   System.out.println("WX message "+ message +" from"+ from + "!");
}
}
public class MessageController{
   private Message message;
   public MessageController(Message message){
   this.message = message;
}
   public void sendMessage(String message,from){
   message.send(message,from);
}
}
public class Test{
   public static void main(String args[]){
    QQ qq = new QQ();
    MessageController mc = new MessageController(qq);
    mc.send("hello", "Ryan");
    WX wx = new WX();
    MessageController mc2 = new MessageController(wx);
    mc2.send("hi","Kiven");
}
}
执行结果:
qq message hello from Ryan!
wx message hi from Kiven!
*扩展 
需求:获取当前公司中员工年龄大于30岁的员工信息,(替换筛选条件,薪水大于5k员工信息?) 

思路:定义一系列的筛选条件算法,并将每个算法进行封装,使之可以相互替换,具体筛选方法的选择交给客户端决定

示例:

public class Employee{
   private String name;
   private int salary;
   private int age;
   public Employee(){}
   public Employee(Strin name,int age,int salary){
   this.name = name;
   this.age = age;
   this.salary = salary; 
}
   public String getName(){return name;}
   public void setName(String name){this.name =name;}
   public int getSalary(){return this.salary}
   public void setSalary(int salary){this.salary= salary;}
   public int getAge(){return this.age;}
   public void setAge(int age){this.age = age;}
   @Override
   public String toString() {
   return "Employee{" + "name='" + name + '\''+"salary='" + salary+ '\'' + ", age=" + age+ '}';
   }
}
public interface MyPredicate<T>{
   boolean judge(T t);
}
public class judgeBySalary implements MyPredicate<Employee>{
    @Override
    public boolean judge(Employee e){
    return e.getSalary()>5000;
}
}
public class judgeByAge implements MyPredicate<Employee>{
   @Override
   public boolean judge(Employee e){
   return e.getAge()>30;
}
}
public class Test{
Lists<Employee> emps = Arrays.asList(new Employee("Peter",25,6000),new Employee("Lily",30,15000));

@Test
public class test(){
List<Employee> newEmp= filterEmployees(emps,new judgeByAge());//根据年龄筛选员工信息
newEmp.forEach(System.out::println);
}

private List<Employee> filterEmployees(List<Employee> emps,MyPredicate<Employee> mp){
   List<Employee> nemps = Lists.newArrayLists();
   emps.forEach(e -> {
   if(mp.judge(e){
   nemps.add(e);
}
});
return nemps;
}
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值