代碼模擬這樣一個場景:客戶要蓋房子,需要去勞務市場找個合適的包工頭來承包自己的工程,找到了合適的包工頭,最後開工。
我按照自己的理解用代碼來逐一剖析、實現這個場景:
1、蓋房子的步驟都是大同小異的,比如所有的蓋房子都是打地基、壘磚
/**
* @Auther: liuzujie
* @Date: 2020/4/29 20:24
* @Desc: 建房子的步驟都大同小異,每個包工頭都會按照自己的方式去實現這些步驟(策略模式)
*/
public interface BuildHouse {
String 打地基();
String 壘磚();
}
2、每個包工頭都會有自己的蓋房子策略(比如有包工頭張三、李四)
/**
* @Auther: liuzujie
* @Date: 2020/4/29 20:28
* @Desc: 張三號稱自己在包工頭界天下第一
*/
public class 包工頭張三 implements BuildHouse {
@Override
public String 打地基() {
return "我們團隊打地基是天下第一";
}
@Override
public String 壘磚() {
return "我們團隊壘磚是天下第一";
}
}
/**
* @Auther: liuzujie
* @Date: 2020/4/29 20:29
* @Desc: 李四號稱自己在包工頭界舉世無雙
*/
public class 包工頭李四 implements BuildHouse {
@Override
public String 打地基() {
return "我們團隊打地基是舉世無雙";
}
@Override
public String 壘磚() {
return "我們團隊壘磚是舉世無雙";
}
}
3、客戶在包工頭界也沒有認識的人,所以只能去勞務市場找了。所有的包工頭都在勞務市場註冊在案,所以我們先來個枚舉類來標識所有的包工頭
/**
* @Auther: liuzujie
* @Date: 2020/4/29 20:34
* @Desc: 所有在勞務市場註冊的包工頭(枚舉標識類)
*/
public enum RegisterMarket {
張三("ZS"), 李四("LS");
private String name;
RegisterMarket(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
4、對客戶這種包工頭界沒有熟人的來說,勞務市場其實就是個門面。客戶在勞務市場找到合適的包工頭後,就可以蓋房子了,看代碼及註釋:
/**
* @Auther: liuzujie
* @Date: 2020/4/29 20:39
* @Desc: 勞務市場,很多包工頭都在這等客戶談生意(門面類)
*/
public class LabourMarket {
private BuildHouse buildHouse; //客戶選的包工頭蓋房子
private RegisterMarket registerMarket; //客戶選的包工頭
/**
* @Auther: liuzujie
* @Date: 2020/4/29 20:40
* @Desc: 客戶從市場裏選一個註冊在案的包工頭標識,然後工廠模式返回這個包工頭實例
*/
public LabourMarket(RegisterMarket registerMarket) {
this.registerMarket = registerMarket;
this.buildHouse = BuildHourseFactory.getSomeOne(registerMarket);
}
public void Building() {
if (buildHouse == null) System.err.println("沒這號人~~~躺在空指針的血泊中..");
System.out.println(buildHouse.打地基() + "\n" + buildHouse.壘磚());
}
/**
* @Auther: liuzujie
* @Date: 2020/4/29 20:39
* @Desc: 根據客戶選的人產生這個人蓋房子對象(工廠模式)
*/
private static final class BuildHourseFactory {
public static BuildHouse getSomeOne(RegisterMarket market) {
if (market == null) return null;
switch (market) {
case 張三:
System.out.println("我張三舉世無雙");
return new 包工頭張三();
case 李四:
System.out.println("我李四登峯造極");
return new 包工頭張三();
default:
return null;
}
}
}
}
5、最後main方法:
/**
* @Auther: liuzujie
* @Date: 2020/4/29 20:43
* @Desc: 我要蓋房子,我是客戶,我要去勞務市場找個合適的包工頭。
*/
public class Client {
public static void main(String[] args) {
//到了市場後找個包工頭給我建房子(客戶只需要確定包工頭就行了,其他都交給門面)
LabourMarket market = new LabourMarket(RegisterMarket.李四);
market.Building();
}
}