我們由一個小小的Demo來引出主題,儘管這個Demo有點長~~,我相信還是值得你一看的!
木蘭詩中有:“雄兔腳撲朔,雌兔眼迷離;雙兔傍地走,安能辨我是雌雄?”
物件之間的比較想必大家都很熟悉。只須用 util
包中的Objects.equals()
方法即可。如果我想找出物件之間不相同的屬性呢?
那肯定是一個一個屬性進行物件啊!
不錯,的確是要一個一個的進行物件,然後找出不有差異的屬性Key。
public class DiffTest {
public static void main(String[] args) {
Person wanger1 = new Person("王小二", 12);
Person wanger2 = new Person("汪小二", 12);
System.out.println(wanger1.diff(wanger2));
}
@Getter
@Setter
public static class Person implements Diffable<Person> {
private String name;
private Integer age;
public Person() {}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public DiffResult<Person> diff(Person that) {
return new DiffBuilder(this, that, ToStringStyle.NO_CLASS_NAME_STYLE)
.append("name", this.name, that.name)
.append("age", this.age, that.age)
.build();
}
}
}
- 依賴的三方包
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
上面的Test藉助了Diffable
這個介面來支援可以進行比對,(一般介面申明成 xxxable 代表著這個類支援某個功能,比如 Jsonable
,Comparable
�...等)
那麼 diff(T obj)
方法 借用了 DiffBuilder
這個類來構建出比對後的結果,裡面的寫法展示了具體構建的過程。最後由build
� 方法返回需要構建出的物件。
最上層的介面非常的簡單!(定義介面難道不是越簡單越好?)
public interface Builder<T> {
/**
* Returns a reference to the object being constructed or result being
* calculated by the builder.
*
* @return the object constructed or result calculated by the builder.
*/
T build();
}
所以構建者模式,就是用程式碼構建一個物件,他演示了一個物件的構建過程,實現方法完全自己實現,我個人非常喜歡這種介面,給你一個白紙隨你畫,當然給你限定了T(總不定義一個狗但build一個貓出來吧!)。是不是和寫作文一樣,擬定好一個主題,然後圍繞著主題發揮你的文采吧!
那麼透過本文你可以學習到以下知識點
- 如何找出物件之間的差異(分辨出雌雄兔子)
- 構建者的上層介面及實際用法之一