23种设计模式----外观模式----结构型模式


23种设计模式

1.什么是外观模式

首先,一个程序有许许多多的功能。举一个最简单的例子:eclipse中有各种各样的功能,我们根据需要不断的切换在不同的窗口工作。在编辑窗口写代码,在包窗口管理文件,在控制台窗口查看输出,在。。。
请想象一下,如果没有窗口区分,那么eclipse的工具菜单有多长,你是否能够一下子找到这些按钮。
对于外观,只是很多的按钮混合在一起,对于这些功能的实现,那么将会是一团乱麻。
比如,在终端窗口,eclipse需要监听键盘消息,需要接受我们的输入;
在编辑窗口同样需要接受输入。。。
难道每需要一个输入的地方,就写一次监听吗?

所以,外观模式无处不在,而且,任何人都会用。
为什么这么说,因为外观模式说简单就是对复杂操作的封装。

2.外观模式

(来自w3cschool,联系删除)
意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口。
何时使用: 1、客户端不需要知道系统内部的复杂联系,整个系统只需提供一个"接待员"即可。 2、定义系统的入口。
如何解决:客户端不与系统耦合,外观类与系统耦合。
关键代码:在客户端和复杂系统之间再加一层,这一次将调用顺序、依赖关系等处理好。
应用实例: 1、去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。 2、JAVA 的三层开发模式。
优点: 1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。
缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
使用场景: 1、为复杂的模块或子系统提供外界访问的模块。 2、子系统相对独立。 3、预防低水平人员带来的风险。
注意事项:在层次化结构中,可以使用外观模式定义系统中每一层的入口。
(来自w3cschool,联系删除)

3.例子

3.1项目结构:

在这里插入图片描述

3.2 基本操作的抽象类

package base.Abs;

public class Base {
	
	protected String name;
	
	public Base(String name){
		this.name = name;
	}
	
	public String getName(){
		return name;
	}
	
}

3.3 具体操作的实现类

package base.impl;

import base.Abs.Base;

public class Base1 extends Base{

	public Base1() {
		super("Base1");
	}

}

package base.impl;

import base.Abs.Base;

public class Base2 extends Base{

	public Base2() {
		super("Base2");
	}

}

package base.impl;

import base.Abs.Base;

public class Base3 extends Base{

	public Base3() {
		super("Base3");
	}

}

package base.impl;

import base.Abs.Base;

public class Base4 extends Base{

	public Base4() {
		super("Base4");
	}

}

package base.impl;

import base.Abs.Base;

public class Base5 extends Base{

	public Base5() {
		super("Base5");
	}

}

package base.impl;

import base.Abs.Base;

public class Base6 extends Base{

	public Base6() {
		super("Base6");
	}

}

package base.impl;

import base.Abs.Base;

public class Base7 extends Base{

	public Base7() {
		super("Base7");
	}

}

3.4 外观类(封装类)

package facade;

import base.impl.Base1;
import base.impl.Base2;
import base.impl.Base3;
import base.impl.Base4;
import base.impl.Base5;
import base.impl.Base6;
import base.impl.Base7;

public class Facade {

	private Base1 b1 = new Base1();
	private Base2 b2 = new Base2();
	private Base3 b3 = new Base3();
	private Base4 b4 = new Base4();
	private Base5 b5 = new Base5();
	private Base6 b6 = new Base6();
	private Base7 b7 = new Base7();
	
	public void f1324657() {
		System.out.println("f1234567:\t" + b1.getName() + " " + b2.getName()
				+ " " + b3.getName() + " " + b4.getName() + " " + b5.getName()
				+ " " + b6.getName() + " " + b7.getName());
	}
	
	public void f7654321(){
		System.out.println("f7654321:\t" + b7.getName() + " " + b6.getName()
				+ " " + b5.getName() + " " + b4.getName() + " " + b3.getName()
				+ " " + b2.getName() + " " + b1.getName());
	}
	
}

3.5 调用者

package client;

import facade.Facade;

public class Main {

	public static void main(String[] args) {
		Facade facade = new Facade();
		facade.f1324657();
		facade.f7654321();
	}

}

3.6 结果

f1234567:	Base1 Base2 Base3 Base4 Base5 Base6 Base7
f7654321:	Base7 Base6 Base5 Base4 Base3 Base2 Base1

4.更好玩的例子

我们都知道计算机可以进行一种计算:加法.
或者更简单一些,计算机只会加1.
那么其他的运算是如何实现的呢?
接下来用外观模式来体验(以整形):

4.1 首先模拟计算机加一

package base;

public class Base {
	
	public static int base(int m){
		m++;
		return m;
	}
	
}

4.2 加法

package add;

import base.Base;

public class Add {

	public static int add(int number1,int number2){
		while(number1 > 0){
			number2 = Base.base(number2);
			number1--;
		}
		return number2;
	}
	
	
}

说明,本来不应该出现自减的,应该用补码的方式实现减一的,不过我尝试一下,使用了大概2到3种方式,没有成功,所以,只能使用自减了。

4.3 减法

package subtraction;

import add.Add;

public class Subtraction {

	public static int subtraction(int number1,int number2){
		return Add.add(number1, 0 - number2);
	}
	
}

4.4 取相反数

package opposite;

import subtraction.Subtraction;

public class Opposite {

	public static int opposite(int number){
		return Subtraction.subtraction(0, number);
	}
	
}

4.5 乘法

package multiplication;

import add.Add;

public class Multiplication {

	public static long multiplication(int number1,int number2){
		int result = 0;
		while(number1 > 0){
			result = Add.add(result, number2);
			number1--;
		}
		return result;
	}
	
}

4.6 除法

package division;

import subtraction.Subtraction;

public class Division {

	private int remainder;
	
	private int division;
	
	public Division(int number1,int number2){
		while(number1 >= number2){
			number1 = Subtraction.subtraction(number1, number2);
			division++;
		}
		remainder = number1;
	}
	
	public int getRemainder(){
		return remainder;
	}
	
	public int getDivision(){
		return division;
	}
	
}

因为除法涉及到返回2个值,商与余数,所以无法像之前那样写,只能以对象的方式写,而不是静态方法。

5.总结

外观模式没什么难以理解,用一个词就是封装。
但是需要合理运用。。。。。
23种设计模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值