package
o_oriented;
/*
设计模式:
解决某一问题最行之有效的方法。java中有23种设计模式。
单例设计模式:
解决一个类在内存只存在一个对象。
思路:
1.为了避免其他程序过多的建立该类对象,先禁止其他程序访问该类对象。
2.但又为了其他程序访问到该类对象,则在该类中自定义一个对象。
3.对外提供一个方法,可以访问该类对象。
步骤:
1.构造函数私有化。
2.在类中创建一个本类对象。
3.创建一个公有方法,获取该类对象。
注意:对于事物,该怎么描述怎么描述,该创建变量则创建变量,该创建功能则创建功能。
当需要保证该类对象在内存中具有唯一性时,则可以使用单例设计模式。
例如:配置文件。
修改配置文件中的参数,修改多次也好,也是修改一个对象的值。
*/
public
class
SingleDemo
{
public
static
void
main
(
String
[]
args
)
{
Single
ss
=
Single
.
getInstance
();
ss
.
setCountry
(
"China"
);
Single
ss1
=
Single
.
getInstance
();
System
.
out
.
println
(
ss1
.
getCountry
());
}
}
class
Single
{
private
String
country
;
public
String
getCountry
() {
return
country
;
}
public
void
setCountry
(
String
country
) {
this
.
country
=
country
;
}
private
Single
(){
}
private
static
Single
s
=
new
Single
();
public
static
Single
getInstance
()
{
return
s
;
}
}
====================================================================================================
package
o_oriented;
/*
饿汉式:
class Single {
private Single(){}
private static Single s = new Single();
public static Single getInstance() {
return s;
}
这个先初始化对象。
Single类一进内存,就已经创建好了对象。
注意:在开发时,用饿汉式。懒汉式在面试当中比较常见,通过结合多线程来解释。
*/
public
class
SingleDemo2
{
public
static
void
main
(
String
[]
args
)
{
}
}
/*
懒汉式:
对象是方法被调用时,才初始化,也叫做对象的延时加载。
Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象。双重判断机制
*/
class
Single
{
private
Single
(){}
private
static
Single
s
=
null
;
public
static
Single
getInstance
() {
if
(
s
==
null
)
{
synchronized
(
Single
.
class
)
{
if
(
s
==
null
)
s
=
new
Single
();
}
}
return
s
;
}
}
====================================================================================================
模板方法设计模式:
package
o_oriented2;
/*
模板方法设计模式:
需求:获取一段程序运行的时间。
原理:获取程序开始和结束的时间并相减即可。
获取时间方法:System.currentTimeMillis();
当代码完成优化后,就可以解决这类问题了。
这种方式,称为模板方法设计模式
什么是模板方法?
在定义功能时,功能的一部分是确定的,但是有一部分是不确定的,而确定的部分在使用不确定的部分,
那么这时就将不确定的部分暴漏出去,由该类的子类去完成。
保证获取功能唯一,不被复写,用final
*/
public
class
TemplateDemo
{
public
static
void
main
(
String
[]
args
)
{
SubTime
sb
=
new
SubTime
();
sb
.
getTime
();
}
}
abstract
class
GetTime
{
public
final
void
getTime
()
{
long
start
=
System
.
currentTimeMillis
();
runCode
();
long
end
=
System
.
currentTimeMillis
();
System
.
out
.
println
(
"time: "
+(
end
-
start
));
}
public
abstract
void
runCode
();
}
class
SubTime
extends
GetTime
{
public
void
runCode
()
{
for
(
int
x
=
0
;
x
<
4000
;
x
++)
{
System
.
out
.
println
(
x
);
}
}
}
====================================================================================================
package
cn.itcast.IO2;
/*
装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。
那么自定义的该类称为装饰类。
装饰类通常会通过构造方法接收被装饰的对象。并基于被装饰的对象的功能,提供更强的功能。
*/
//普通类
class
Person
{
public
void
eat
()
{
System
.
out
.
println
(
"吃饭"
);
}
}
//装饰类,增强Person类的功能。
class
SuperPerson
{
private
Person
p
;
SuperPerson
(
Person
p
)
{
this
.
p
=
p
;
}
public
void
superEat
()
{
System
.
out
.
println
(
"开胃酒"
);
p
.
eat
();
System
.
out
.
println
(
"甜点/餐后水果"
);
}
}
public
class
PersonDemo
{
public
static
void
main
(
String
[]
args
) {
Person
p
=
new
Person
();
SuperPerson
sp
=
new
SuperPerson
(
p
);
sp
.
superEat
();
}
}