黑马程序员_设计模式

----------- android培训java培训、java学习型技术博客、期待与您交流! ---------




设计模式:
通过很多东西抽取出来的一个模型。

创建型:创建对象。工厂模式,单例模式。
结构型:对象间的关系。装饰模式。
行为型:对象能够做什么。模板模式。

工厂模式:
比如说,我们现在有很多动物类,猫,狗,猪...
而这些动物有相同的行为,eat()。
抽取一个共同的父类。动物。

简单工厂模式:
Animal
|--Dog
|--Cat

AnimalFactory
public static Animal createAnimal(String type){
if("dog".equals(type)){
return new Dog();
}else if("cat".equals(type)){
return new Cat();
}else {
return null;
}
}

工厂方法模式:
Animal
|--Dog
|--Cat
|--Pig

AnimalFactory
|--DogFactory
|--CatFactory
|--PigFactory


单例模式:
就是指类在内存中只能有一个对象。
举例:windows的打印服务,网站计数器
应用:线程池,数据库连接池

面试题:请写出一个单例设计模式。

分析:
类在内存中只能有一个对象。

A:外界不能够随意创建对象。
把构造方法私有
B:类本身要创建一个对象。
C:通过公共的方式提供给别人。

单例模式分类:
饿汉式:类加载就创建对象(开发用)
public class Student {
// 把构造方法私有,是为了不让外界随意创建
private Student() {
}
private static Student s = new Student();

// 提供公共的方式让别人使用
// 为了让外界能够直接通过类名访问该方法,需要对该方法加静态
public static Student getStudent() {
return s;
}
public void show() {
System.out.println("hello");
}
}

懒汉式:
public class Teacher {

private Teacher() {
}

private static Teacher t = null;

public synchronized static Teacher getTeacher() {
if (t == null) {
t = new Teacher();
}
return t;
}

public void show() {
System.out.println("world");
}
}
什么时候用,就什么时候创建。
为什么?
A:延迟加载。
B:线程安全问题。怎么解决呢?
装饰模式:对类原有的功能进行了修饰或者扩充。
我们都有手机,手机具备打电话的功能。
按照正常做法,我们应该把手机类给设计出来,并给出一个打电话功能。Phone.java
随着发展,人的需求也是在变化的,假设我现在需要在打电话前听到彩铃,而这种需求是部分人需要的,那么,现在我们该怎么办呢?
回想我们曾经学过继承,通过继承就可以具备父亲的打电话功能,我还可以在新的手机上添加彩铃功能。ColorPhone.java
继续发展,人的需求又发生改变了,我想在打完电话后,可以播放广告。GuangGaoPhone.java
需求继续改变,我想要先有彩铃,接着打电话,最后放广告。
A:继承ColorPhone
B:继承Phone,然后自己实现彩铃,父亲的打电话,自己实现广告
需求还是可以继续发生改变的,使用继承可以解决问题,但是,将来一旦某个父亲发生了改变,依赖这个父亲的子类都会发生改变。
所以,这种解决方案可以,但是不好。

Phone
|--ColorPhone
|--ColorGuangGaoPhone
|--...
|--GuangGaoPhone
|--...

既然不好,那么, 在开发的过程中,就会有相应的东西来替代它。
这种东西就叫:设计模式。
而我们讲解的这种模式:装饰设计模式。
A:被装饰的抽象事物 Phone
B:具体的事物 PhoneImpl
实现Phone接口,具体实现类
C:装饰类 PhoneDecorate
实现Phone接口,调用实现。

private Phone phone;

public PhoneDecorate(Phone phone) {
this.phone = phone;
}

@Override
public void call() {
this.phone.call(); // 具体的手机打电话功能
}


要有彩铃:
具有彩铃功能的装饰类
要有广告:
具有广告功能的装饰类
要有先彩铃,接着电话,最后广告功能。
...


Phone(接口)
|--PhoneImpl(具体实现类)
|--PhoneDecorate(抽象类)
|--ColorPhoneDecorate(具体装饰类)
|--GuangGaoPhoneDecorate(具体装饰类)
模板模式:
我需要打印一篇文章,这篇文章:
头,中间,尾组成。

Print
print(){
printHead();
printBody();
printBottom();
}
printHead(){}
printBody(){}
printBottom(){}

这样做的话,我们就得把打印操作给固定了,固定后如果有新的变化,发现不好。
怎么办呢?我们就采用一种设计模式解决:模板模式。

模板类:(抽象类)

打印模板类:
打印方法:具体的。

三个抽象方法。




----------- android培训java培训、java学习型技术博客、期待与您交流! ---------

猜你喜欢

转载自alh8023.iteye.com/blog/2208156