设计模式
设计模式是一套被反复使用、多数人知晓的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解。设计模式使代码编制真正工程化,它是软件工程的基石脉络,如同大厦的结构一般。
在毕老师的java基础视频中,我学到了以下几种设计模式:
单例设计模式
单例设计模式是一种比较常见的设计模式,使用单例设计模式有什么好处呢?
1.通过线程的同步来控制资源的并发访问。
2.控制实例产生的数量,达到节约资源的目的。
3.作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的线程通信。(查阅网上的资料得来,不太懂)
如何实现单例设计模式呢?
有以下两种方法:
1.在要实现单例模式的的类里将构造函数私有化,然后在类中创建一个本类对象,再提供一个方法来获取该对象。例如:
饿汉式:先初始化对象
class Single{
private Single(){}
private static Single s = new Single();
public static Single getInstance()
{
return s;
}
}
懒汉式:对象在方法被调用时才初始化,也叫做对象的延时加载。
class Single
{
private static Single s = null;
private Single( ){ }
public static Single getInstance ()
{
if(s==null)
s = new Single();
return s;
}
}
人们在开发中常用饿汉式,较少用懒汉式,但这可能出现在你的面试题中,所以还是值得一看。
2.用枚举来实现单例设计模式,这可能是最好的实现单例模式的方式。
public enum Student{
single("LiMing",18);
private String name;
private int age;
<pre name="code" class="java"> private Student(String name,int age){
this.name = name;
this.age = age;
}
}
模版方法设计模式
在我们定义功能的时侯,功能有一部分是确定的,另一部分不确定,而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴露出去。由该类的子类去完成。
以下参考毕老师的TemplateDemo代码。
abstract class GetTime
{
public final void getTime()
{
long start = System.currentTimeMillis();
runcode();
long end = System.currentTimeMillis();
System.out.println("毫秒:"+(end-start));
}
public abstract void runcode();
}
class SubTime extends GetTime
{
public void runcode()
{
for(int x=0; x<4000; x++)
{
System.out.print(x);
}
}
}
class TemplateDemo
{
public static void main(String[] args)
{
SubTime gt = new SubTime();
gt.getTime();
}
}
在这段代码中,父类GetTime将不确定的那一部分:runcode方法定义为抽象,留给子类去复写,子类SubTime复写了父类中runcode()方法后,变成了独特的、更具体的类。我们在设计程序时,也应该有这种思想,将共有的部分抽取出来作为一个模版,让子类去复写其中不确定的部分,并调用已知可用的功能来实现相应的方法。稍微需要注意的是,不是所有方法都需要复写,其中不应该被复写的方法我们可以加上final修饰符,让子类继承时无法复写。
装饰设计模式
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的该类称为装饰类。装饰类通常会通过构造方法接受被装饰的对象,并基于被修饰类的对象的功能,提供更强的功能。
好处:装饰体系比继承体系更加灵活,避免了继承体系的臃肿,而且降低了类与类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能,所以装饰类和被装饰类往往是一个体系的。装饰类让继承结构变成组合结构。
class Person
{
public void chifan()
{
System.out.println("吃饭");
}
}
class SuperPerson
{
private Person p ;
SuperPerson(Person p)
{
this.p = p;
}
public void superChifan()
{
System.out.println("开胃酒");
p.chifan();
System.out.println("甜点");
System.out.println("来一根");
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p = new Person();
//p.chifan();
SuperPerson sp = new SuperPerson(p);
sp.superChifan();
}
}
在这段代码中,我们在person的基础上建立了superPerson这个类,并且加强了chifan方法,这样的设计是站在原有的类的基础上的,比继承更加灵活些。