①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;
}
}