设计模式学习_建造者
最近在封装项目对话框模块时,看了下安卓对话框封装源码,然后顺便学习了建造者模式。。。
以前买个几本关于设计模式的书,但那时思想跟不过来一直看不懂,随着时间推移,代码写多了,看别人的代码页看多了,然后开始慢慢理解传说中的设计模式了。一句话思考很重要。
问题
做项目时,可能会遇到一个要组建一个复杂对象的问题,比如打印不同类型的单子,或者弹出不同类型的对话框、底部栏等。虽然他们表现形式不同,但都有相同的格式或者准则。只是内容不一样摆了。如果只是把实现方法封装在一个类的话,如果表现显示多了,可能会造成类膨胀。这时我们或许可以考虑把这个复杂的对象DIY化?就像组装电脑一样,我需要哪个部件拿哪个样式部件。这时,建造者应该可以闪亮登场了。
意图
将一个复杂对象的构建和它的表示分离开来,使得同样的构建过程可以创建不同的表示。
模型图——百度
举例
传说有个催眠大湿,能把以个普通人变成各种各样的人,这个催眠大湿就是传说的建造者了。有一天两个各方面都非常普通的小明和小红找大湿使他们变成高富帅。小明给了5毛钱,小红以色诱大湿,大湿思考了下然后便使出了催眠术——葵花宝典。。。
催眠流程图——无
代码——有
听说现在的人只有身高、财富、外貌这三个属性
public class Man
{
private String shengao;
private String caifu;
private String waimao;
private String name;
public Man(String name) {
// TODO Auto-generated constructor stub
this.name=name;
this.shengao="中";
this.caifu="中";
this.waimao="中";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getShengao() {
return shengao;
}
public void setShengao(String shengao) {
this.shengao = shengao;
}
public String getCaifu() {
return caifu;
}
public void setCaifu(String caifu) {
this.caifu = caifu;
}
public String getWaimao() {
return waimao;
}
public void setWaimao(String waimao) {
this.waimao = waimao;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return name+":"+shengao+caifu+waimao;
}
}
这个就是催眠大湿改变人的步骤了
public interface Builder{
public void setShengao();
public void setCaifu();
public void setWaimao();
public void printMan();
}
变成高富帅的秘籍
public class GFSMan implements Builder
{
private Man man;
public GFSMan(Man man) {
// TODO Auto-generated constructor stub
this.man=man;
}
@Override
public void setShengao() {
// TODO Auto-generated method stub
this.man.setShengao("高");
}
@Override
public void setCaifu() {
// TODO Auto-generated method stub
this.man.setCaifu("富");
}
@Override
public void setWaimao() {
// TODO Auto-generated method stub
this.man.setWaimao("帅");
}
@Override
public void printMan() {
// TODO Auto-generated method stub
System.out.println(this.man.toString()) ;
}
}
public class AQCMan implements Builder
{
private Man man;
public AQCMan(Man man) {
// TODO Auto-generated constructor stub
this.man=man;
}
@Override
public void setShengao() {
// TODO Auto-generated method stub
this.man.setShengao("矮");
}
@Override
public void setCaifu() {
// TODO Auto-generated method stub
this.man.setCaifu("穷");
}
@Override
public void setWaimao() {
// TODO Auto-generated method stub
this.man.setWaimao("挫");
}
@Override
public void printMan() {
// TODO Auto-generated method stub
System.out.println(this.man.toString()) ;
}
}
小明和小红改变命运的时刻到了
public class Builder_main {
/**
* 建造者模式
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//高富帅的小明
Man xiaoming =new Man("小明");
Builder builder=new GFSMan(xiaoming);
builder.setShengao();
builder.setCaifu();
builder.setWaimao();
builder.printMan();
//矮穷中的小红
Man xiaohong =new Man("小红");
builder=new AQCMan(xiaohong);
builder.setShengao();
builder.setCaifu();
builder.printMan();
}
}
结果:给钱的小明终于实现了他的梦想,而色诱大湿的小红则被变成了矮挫中。
小明和小红的故事到此为止。
还有种方式是,具体数据由调用的类填写。
public class CuiMianDaShi {
protected CuiMianDaShi(Man man) {
// TODO Auto-generated constructor stub
}
public static class Builder{
private Man man;
public Builder(Man man) {
// TODO Auto-generated constructor stub
this.man=man;
}
public Builder setShengao(String str)
{
this.man.setShengao(str);
return this;
}
public Builder setCaifu(String str)
{
this.man.setCaifu(str);
return this;
}
public Builder setWaimao(String str)
{
this.man.setWaimao(str);
return this;
}
public void PrintMan()
{
System.out.println(this.man.toString()+"\n") ;
}
}
}
public class Builder_main {
/**
* 建造者模式
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//方式2
Man xiaodong =new Man("小东");
new CuiMianDaShi.Builder(xiaodong)
.setCaifu("穷")
.setShengao("矮")
.setWaimao("挫").PrintMan();
}
}
结果这两种方式,都实现了将一个复杂对象的构建和它的表示分离开来。
两种方式的区别——无。
最后,第一次写文章——好累- -