大话设计模式-外观模式-2020-10-14
2020-10-14 本文已影响0人
勇往直前888
定义
为子系统中一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
结构图
image.png使用场景
1.在设计初期,应该要有意识将两个系统分离开,例如三层系统,逻辑层与页面层之间建立外观,这样为复杂的系统提供简单接口,使得耦合大大降低。
2.在开发阶段,子系统由于不断重构演化而变得复杂,用外观模式可以提供简单的接口,减少两者依赖。
3.在维护阶段,这个系统已经难以维护,但是新系统又依赖他,外观可以提供旧系统的接口,新系统只跟外观打交道。
买卖基金的例子
image.png这里的基金就是外观模式中的外观Facade
- 具体的操作类;也就是股票、国债、房产等具体操作类
class Stock1 {
public String Buy() {
String message = "股票1买入\n";
Log.v("Stock1", message);
return message;
}
public String Sell() {
String message = "股票1卖出\n";
Log.v("Stock1", message);
return message;
}
}
class Stock2 {
public String Buy() {
String message = "股票2买入\n";
Log.v("Stock2", message);
return message;
}
public String Sell() {
String message = "股票2卖出\n";
Log.v("Stock2", message);
return message;
}
}
class Stock3 {
public String Buy() {
String message = "股票3买入\n";
Log.v("Stock3", message);
return message;
}
public String Sell() {
String message = "股票3卖出\n";
Log.v("Stock3", message);
return message;
}
}
class NationalDebt1 {
public String Buy() {
String message = "国债1买入\n";
Log.v("NationalDebt1", message);
return message;
}
public String Sell() {
String message = "国债1卖出\n";
Log.v("NationalDebt1", message);
return message;
}
}
class Realty1 {
public String Buy() {
String message = "房产1买入\n";
Log.v("Realty1", message);
return message;
}
public String Sell() {
String message = "房产1卖出\n";
Log.v("Realty1", message);
return message;
}
}
- 外观类;也就是基金类
class Fund {
Stock1 gu1;
Stock2 gu2;
Stock3 gu3;
NationalDebt1 nd1;
Realty1 rt1;
public Fund() {
gu1 = new Stock1();
gu2 = new Stock2();
gu3 = new Stock3();
nd1 = new NationalDebt1();
rt1 = new Realty1();
}
public String Buy() {
return gu1.Buy() + gu2.Buy() + gu3.Buy() + nd1.Buy() + rt1.Buy();
}
public String Sell() {
return gu1.Sell() + gu2.Sell() + gu3.Sell() + nd1.Sell() + rt1.Sell();
}
}
- 测试界面
- 客户端
public class FacadeActivity extends AppCompatActivity {
public static void launch(Context context) {
if (null != context) {
Intent intent = new Intent();
intent.setClass(context, FacadeActivity.class);
if (!(context instanceof Activity)) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
context.startActivity(intent);
}
}
TextView infoTextView;
Fund jijin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_facade);
setTitle("外观模式");
infoTextView = findViewById(R.id.textViewInfo);
jijin = new Fund();
}
public void onBuyClick(View view) {
infoTextView.setText(jijin.Buy());
}
public void onSellClick(View view) {
infoTextView.setText(jijin.Sell());
}
}
Demo地址
https://gitee.com/zhangxusong888/Android/tree/master/design_pattern