设计模式的分类
总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
装饰设计模式:
定义类将已有对象传入,已有对象进行功能增强,基于当前功能提供加强功能,该自定义类称为装饰类。
构造函数传递进行功能增强
对“Person”这个类进行功能增强:
//定义Person类
class Person
{
public void chifan()
{
System.out.println("吃饭");
}
}
//定义一个新的类SuperPerson
class SuperPerson
{
//在SuperPerson中定义Person的对象
private Person p;
//通过构造函数传入Person类的实例对象,并把他赋给SuperPerson的全局变量p
SuperPerson(Person p)
{
this.p = p;
}
//在新的类中定义chifan的增强功能
public void superChifan()
{
System.out.println("开胃酒");
p.chifan();
System.out.println("甜点");
System.out.println("来一根");
}
}
class PersonDemo
{
public static void main(String[] args)
{
//创建Person类实例对象
Person p = new Person();
//创建SuperPerson实例对象并通过构造函数传入Person实例对象
SuperPerson sp = new SuperPerson(p);
//可以使用SuperPerson的增强功能
sp.superChifan();
}
}
装饰与继承的区别:
装饰模式比继承要灵活。避免了继承体系臃肿。 而且降低了类于类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。 所以装饰类和被装饰类通常是都属于一个体系中的,一般继承同一个类或同一个接口。
想装饰一组类的时候,可以传入父类
单例设计模式:
通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
通过三步完成:
1、将构造函数私有化
2、在类中创建一个本类的对象
3、对外提供获取该对象的方法
单例设计模式有饿汉式跟懒汉式两种方式:
饿汉式:
class Test
{
//1、将构造函数私有化
private Test(){}
//2、在类中创建一个本类的对象
private static Test t = new Test();
//3、对外提供获取该对象的方法
public stasic Test getInstance()
{
return t;
}
}
class Demo
{
public static void main(String[] args)
{
Test te = Test.getInstance();
}
}
懒汉式:
对象被调用时才初始化(对象的延时加载)
多线程可能会出现问题,所以这种方法较少使用,需要使用synchronized进行同步。
class Test
{
private Test(){}
private static Test t = null;
//方法被调用时才进行初始化
public stasic Test getInstance()
{
if(t == null)
{
t = new Test();
}
return t;
}
}
class Demo
{
public static void main(String[] args)
{
Test te = Test.getInstance();
}
}
模版方法设计模式:
在定义功能时,该代码的一部分是确定的,另一部分是不确定的,而确定的部分在调用不确定的部分,那么把不确定的部分暴漏出去,确定的部分做父类,不确定部分抽象化,具体功能由子类复写完成。
public abstract class AbstractCalculator {
/*主方法,实现对本类其它方法的调用*/
public final int calculate(String exp,String opt){
int array[] = split(exp,opt);
return calculate(array[0],array[1]);
}
/*被子类重写的方法*/
abstract public int calculate(int num1,int num2);
}