提炼类/融合类
提炼类动机:一个类的行为过多;一个类与另一个类合作太多,高度耦合。
通过提炼,搬移函数,能划分清楚类的职责,减少类的耦合。
import lombok.Data;
@Data
public class Person {
private String name;
private int age;
private int id;
/**
* 这还有20个字段
*/
private int phoneNumber;
private int VChat;
private int QQ;
public void setCommunication(int phoneNumber,int VChat,int QQ){
this.phoneNumber = phoneNumber;
this.QQ = QQ;
this.VChat = VChat;
}
public Person getCommunication(int id){
Person person = new Person();
person.setId(1);
person.setAge(10);
person.setName("张三");
person.setCommunication(123,456,789);
return person;
}
}
import lombok.Data;
@Data
public class Person {
private String name;
private int age;
private int id;
/**
* 这还有20个字段
*/
private Communication communication;
public void setCommunication(int phoneNumber,int VChat,int QQ){
communication = new Communication(phoneNumber,VChat,QQ);
}
public Person getCommunication(int id){
Person person = new Person();
person.setId(1);
person.setAge(10);
person.setName("张三");
person.setCommunication(123,456,789);
return person;
}
}
import lombok.AllArgsConstructor;
import lombok.Data;
@AllArgsConstructor
@Data
public class Communication {
private int phoneNumber;
private int VChat;
private int QQ;
}
融合类动机:当一个类承担的责任不够多,就通过提炼类的相反操作,把责任较少的类融合进另一个类。
增加/删除委托关系
增加委托关系动机:封装使对象尽可能少的了解系统的其他部分,当需求发生变化时,更容易拓展,通过增加委托关系,可以使封装更彻底。
还是上边的例子,当客户端要知道某个Person的phoneNumber时,需要通过Communication类,才能拿到phoneNumber,这样客户端就知道了拿到phoneNumber的细节,先拿到Communication类,才能进一步拿到phoneNumber。
public static void main(String[] args) {
new Person().getCommunication().getPhoneNumber();
}
//通过在Person类增加一层委托,可以隐藏拿到phoneNumber的细节。
public int getPhoneNumber(){
return getCommunication().getPhoneNumber();
}
public static void main(String[] args) {
new Person().getPhoneNumber();
}
删除委托关系动机:当被委托类的功能越来越多,委托类完全成为了转发人,每当被委托类提供了新功能,委托类就得提供一个委托函数,很麻烦,此时通过删除委托方法,让客户直接访问被委托类。
public static void main(String[] args) {
new Person().getCommunication().getPhoneNumber();
}