——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——
一、设计模式概述
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
1.设计模式不是一种方法和技术,而是一种思想
2.设计模式和具体的语言无关,学习设计模式就是要建立面向对象的思想,尽可能的面向接口编程,低耦合,高内聚,使设计的程序可复用
3.学习设计模式能够促进对面向对象思想的理解,反之亦然。它们相辅相成
二、面向对象思想的设计原则
1.单一职责原则:每个类只实现一种功能,即类的设计应该遵循高内聚,低耦合原则
2.开闭原则:对扩展开放,对修改关闭,类的改动应该通过增加代码来完成,而不是修改原有的代码
3.里氏替换原则:在任何父类出现的地方都可以用它的子类来替代。
4.依赖注入原则:在应用程序中,所有的类如果使用或依赖于其他的类,则应该依赖这些其他类的抽象类,而不是这些其他类的具体类,针对接口编程
5.接口分离原则:不应该强迫程序依赖它们不需要使用的方法。即一个接口应该只提供一种对外的功能,不应该把所有的操作都封装到一个接口中。
6.迪米特原则:一个对象对其他对象知道的越少越好,即降低耦合,提高内聚。
三、常见的设计模式简介
1.单例设计模式:确保类在内存中只有一个对象,该实例必须自动创建,并且对外提供。
<1>饿汉式:在类初始化时创建类的实例,无论是否会用到该实例,都会执行创建对象操作
public class Singleton
{
//一个私有的静态实例对象
private static Singleton singleton = new Singleton();
//私有的构造方法,防止程序创建类的对象
private Singleton() { }
//一个公共方法用于获取类的实例
public static Singleton getInstance() {
return singleton;
}
}
懒汉式:在需要使用该类对象的时候才进行对象的创建
public class Singleton {
private static Singleton singleton = null;
private Singleton() { }
public static Singleton getInstance() {
//判断是否已经创建了类的实例,如果已创建,则不再创建。
if (singleton== null) {
singleton= new Singleton();
}
return singleton;
}
线程安全的单例:防止在多线程情况下出现多个实例。
public class Singleton
{
private static Singleton singleton = null;
private Singleton() { }
public static Singleton getInstance() {
if (singleton== null) {
synchronized (Singleton.class) {
if (singleton== null) {
singleton= new Singleton();
}
}
}
return singleton;
}
}
2.装饰设计模式
装饰设计模式是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式。就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。
IO流中的装饰设计模式:
// 文件输入流包装输入流从而对文件进行操作
FileInputStream fis = new FileInputStream("input.txt");
// 缓冲输入流包装文件输入流,以提高文件输入流读取数据的效率
BufferedInputStream bis = new BufferedInputStream(fis);
代码案例:
假设定义一部手机,而手机需要实现很多的功能,但最基本的,应该有打电话的功能,那么定义一个接口如下:
public interface Phone {
public void call();
}
// 顺便定义一个具备基本功能的手机类
public class Iphone implements Phone {
@Override
public void call() {
System.out.println("Iphone 可以打电话。");
}
}
那么假设由于技术提高,手机又有了新功能,听音乐,那么可以用装饰设计模式思想实现:
public abstract class PhoneDecorate implements Phone {
private Phone p;
public PhoneDecorate(Phone p) {
this.p = p;
}
@Override
public void call() {
p.call();
System.out.println("Iphone可以听音乐");
}
}
此时就可以在不继承Iphone类的基础上,对Iphone的功能进行拓展,相对于继承来说,更加具备灵活性。
3.适配器设计模式
适配器设计模式是指当一个接口有多个功能,而在实现这个接口的时候,仅仅需要实现部分功能,这时候可以定义一个抽象类,给出接口中所有方法的空实现,然后由需要实现该接口中某些方法的具体类来选择性的实现抽象类中的方法。
代码示例:
public interface someMethods {
void method1();
void method2();
void method3();
}
public abstract someMethodsAdapter {
public void method1() {}
public void method2() {}
public void method3() {}
}
public class A extends someMethodAdapter {
@Override
public void method1() {
System.out.println("实现了method1");
}
}
适配器设计模式的优点:让本来不适合使用的接口变得适合使用
缺点:一次只能适配一个类,使用有一定的局限性