针对某一问题的最佳解决方案,我们在程序中称之为设计模式。
设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,免得我们自己再去思考和摸索。
设计模式很好学,但是碰到问题要想到用什么设计模式解决才是真正的目的。
java一共有32种设计模式。
1. 单态设计模式
{
//3.提供一个私有静态变量记住一个实例,用于返回。类是在第一次被使用的时候才进行加载,而且只加载一次,所以,这个静态变量只被初始化一次。
//1.构造方法私有化
private Person7(){}
//2.提供此方法来给外界获得实例
public static Person7 getInstance()
{
return p;
}
}
{
public static void main(String args[])
{
Person7 p1 = Person7.getInstance();
Person7 p2 = Person7.getInstance();
Person7 p3 = Person7.getInstance();
//p3.p = null;
Person7 p4 = Person7.getInstance();
System.out.println(p1);
System.out.println(p2);
System.out.println(p3);
System.out.println(p4);
}
}
/*组合设计模式
1.当我们在实现一个类的方法时,需要用到其他的类,用到的类和当前类又不构成继承关系,此时,就需要用组合
2.如果一个类能正常工作的前提就是必须用到另一个类的方法,这时首先需要将用到的类组合进来
3.组合: 将需要的对象定义为当前对象的属性,让别人通过构造函数装配进来
4.通常我们在定义类的时候组合进来的对象不是为了给自己用,而是给父类去用
*/
class Card{
public void spend(){
System.out.println("一不小心花了400个大洋");
}
}
class Person8{
private Card card;
public Person8(Card card){
this.card = card;
}
public void shopping(){
card.spend();
}
}
class Chinese extends Person8{
public Chinese(Card card){
super(card);
}
public void shopping(){
System.out.println("讨价还价!!");
super.shopping();
}
}
class Demo8{
public static void main(String args[]){
Card card = new Card();
Person8 p = new Person8(card);
p.shopping(); //此方法调用成功的前提是它的内部去调用了Card类的spend方法
Card card1 = new Card();
Chinese ch = new Chinese(card1);
ch.shopping();
new Chinese(new Card(){
public void spend(){
System.out.println("使用饭卡成功消费!!!");
}
}).shopping();
}
}
public class AccitemBOImpl extends BaseBO implements AccitemBO {
private AccitemDAO accitemDAO;
public AccitemDAO getAccitemDAO() {
return accitemDAO;
}
public void setAccitemDAO(AccitemDAO accitemDAO) {
this.accitemDAO = accitemDAO;
}
}
/*
模板方法设计模式:
定义一个抽象的父类作为模板,在模板中规定做事情的先后顺序,
具体每个步骤怎么做交给具体的子类去实现
*/
abstract class AbstractPrint
{
abstract void open();
abstract void print();
abstract void close();
public final void run()
{
//规定做事情的顺序
open();
print();
close();
}
}
class StringPrint extends AbstractPrint
{
private String data;
public StringPrint(String data)
{
this.data = data;
}
public void open()
{
System.out.print("<<");
}
public void close()
{
System.out.println(">>");
}
public void print()
{
System.out.print(data);
}
/*因为父类的run()被final了,所以模板就不能随便改了
public void run()
{
print();
close();
open();
}*/
}
class Demo12
{
public static void main(String args[])
{
StringPrint sp = new StringPrint("hello");
sp.run();
//为什么可以new?
new AbstractPrint(){
public void open()
{
System.out.print("[[");
}
public void print()
{
System.out.print('a');
}
public void close()
{
System.out.println("]]");
}
}.run();
}
}