设计模式:23种,按照一定的规范设计程序
外观模式:
通过简易的外观,将我们复杂的内部结构,呈现在我们面前(面向对象的思想)
电脑主机是电脑的外观
建筑的外墙是建筑的外观
例子1:
旅游(自驾游):
1、规划路线
2、订酒店
3、订票
旅游(旅行社):
出钱
( 1、规划路线
2、订酒店
3、订票)
例子2:
家里每个房间的电源开关------总闸
单例模式:在任何情况下只有一个对象实例
特点:
1、单例类只能有一个实例
2、单例必须自己创建对象
3、单例类需要对外提供该对象
分类:
饿汉式:
1、将构造方法私有化
2、在本类声明创建一个自己的对象
3、提供一个公共
静态的方法,返回该对象
public
class
HungryUser {
//2、在本类声明创建一个自己的对象
private
static
HungryUser
hungryUser
=
new
HungryUser();
//1、将构造方法私有化
private
HungryUser() {
}
//3、提供一个公共静态的方法,返回该对象
public
static
HungryUser getInstance() {
return
hungryUser
;
}
}
懒汉式:
1、将构造方法私有化
2、声明单例对象(不初始化)
3、提供一个
加锁了的公共
静态的方法。判断对象实例是否存在:存在,直接返回。不存在,创建返回。
public
class
LazyUser {
//2、声明单例对象(不初始化)
private
static
LazyUser
lazyUser
=
null
;
//1、将构造方法私有化
private
LazyUser() {
}
//3、提供一个加锁了的公共静态的方法。判断对象实例是否存在:存在,直接返回。不存在,创建返回。
public
synchronized
static
LazyUser getInstance() {
if
(
lazyUser
==
null
) {
lazyUser
=
new
LazyUser();
}
return
lazyUser
;
}
}
经验之谈:
一般情况下,不建议使用第 1 种和第 2 种懒汉方式,建议使用第 3 种饿汉方式。只有在要明确实现 lazy loading 效果时,才会使用第 5 种登记方式。如果涉及到反序列化创建对象时,可以尝试使用第 6 种枚举方式。如果有其他特殊的需求,可以考虑使用第 4 种双检锁方式。
简单工厂模式:
为不同的子类提供一个公共的出口,具体需要哪个子类对象,由用户决定。
知识点:面向对象的多态和继承
例子:我发达了,我想买狗、买猫、买鸟。分别去狗市场、猫市场、鸟市场分别购买。
工厂模式:弄一个动物市场,直接购买
装饰者模式:不改变原有类功能的情况下 实现对其功能的加强或者新增。通过构造方法实现增强。
IO流:利用装饰者模式设计
字节流:InputStream OutputStream
public
abstract
class
Hero {
static
int
gjl
= 1;
static
int
fq
= 1;
static
int
hj
= 1;
static
int
mk
= 1;
public
abstract
void
heroInfo();
}
//英雄
public
class
LolHero
extends
Hero{
@Override
public
void
heroInfo() {
System.
out
.println(
"攻击力:"
+
super
.
gjl
+
"法强:"
+
super
.
fq
+
"护甲:"
+
super
.
hj
+
"魔抗:"
+
super
.
mk
);
}
}
//装备
public
class
LolHeroZb
extends
Hero {
private
Hero
hero
;
public
LolHeroZb(Hero
hero
) {
this
.
hero
=
hero
;
}
@Override
public
void
heroInfo() {
//
TODO
Auto-generated method stub
}
}
//装备:帽子
public
class
Mz
extends
LolHeroZb{
public
Mz(Hero
hero
) {
super
(
hero
);
super
.
fq
+= 3;
addFq(
super
.
fq
);
}
public
void
addFq(
int
fq
){
System.
out
.println(
"装备帽子以后法强提高为:"
+
fq
);
System.
out
.println(
"攻击力:"
+
super
.
gjl
+
"法强:"
+
super
.
fq
+
"护甲:"
+
super
.
hj
+
"魔抗:"
+
super
.
mk
);
}
}
//武器:无尽
public
class
Wj
extends
LolHeroZb{
public
Wj
(Hero
hero
) {
super
(
hero
);
super
.
gjl
+= 2;
addGjl(
super
.
gjl
);
}
public
void
addGjl(
int
gjl
){
System.
out
.println(
"装备无尽以后攻击力提高为:"
+
gjl
);
System.
out
.println(
"攻击力:"
+
super
.
gjl
+
"法强:"
+
super
.
fq
+
"护甲:"
+
super
.
hj
+
"魔抗:"
+
super
.
mk
);
}
}
public
class
Test {
public
static
void
main(String[]
args
) {
LolHero
hero
=
new
LolHero();
hero
.heroInfo();
//装备:帽子
Mz
mz
=
new
Mz(
hero
);
//武器:无尽
Wj
wj
=
new
Wj(
hero
);
}
}
观察者模式:
观察者:天气App:实现接口,即实现具体的新消息处理方法。
被观察者(主题):气象台:提供注册方法,得到所有实现了接口的观察者,当变化时,调用所有注册了的观察者的接口方法。
使用API:
//被观察者
public
class
WeatherStation
extends
Observable{
private
String
data
;
public
WeatherStation() {
System.
out
.println(
"气象台开始获取数据。。。请等待2S"
);
new
Thread(
new
MyRunnable()).start();
}
public
class
MyRunnable
implements
Runnable {
@Override
public
void
run() {
try
{
Thread.
sleep
(2000);
}
catch
(InterruptedException
e
) {
//
TODO
Auto-generated catch block
e
.printStackTrace();
}
System.
out
.println(
"气象台获取成功,开始推送"
);
data
=
"今天天气:阴 -1°"
;
setChanged();
notifyObservers();
}
}
public
String getData() {
return
data
;
}
public
void
setData(String
data
) {
this
.
data
=
data
;
}
}
//观察者
public
class
AppWeather
implements
Observer {
private
String
name
;
public
AppWeather(Observable
observable
, String
name
) {
observable
.addObserver(
this
);
this
.
name
=
name
;
// System.out.println(name + "启动");
}
@Override
public
void
update(Observable
o
, Object
arg
) {
System.
out
.println(
name
+
"提示"
+ ((WeatherStation)
o
).getData());
}
}
public
class
Main {
public
static
void
main(String[]
args
) {
//
TODO
Auto-generated method stub
WeatherStation
weatherStation
=
new
WeatherStation();
AppWeather
appWeather1
=
new
AppWeather(
weatherStation
,
"墨迹天气"
);
AppWeather
appWeather2
=
new
AppWeather(
weatherStation
,
"百度天气"
);
AppWeather
appWeather3
=
new
AppWeather(
weatherStation
,
"苹果天气"
);
}
}
使用接口:
public
interface
LightListener {
void
onLightChanged(String
data
);
}
//被观察者
public
class
TrafficLight {
private
ArrayList<LightListener>
listeners
;
public
TrafficLight() {
listeners
=
new
ArrayList<LightListener>();
System.
out
.println(
"当前为红灯,停车等待2S"
);
new
Thread(
new
MyRunnable()).start();
}
public
void
subscribe(LightListener
listener
) {
listeners
.add(
listener
);
}
public
class
MyRunnable
implements
Runnable{
@Override
public
void
run() {
try
{
Thread.
sleep
(2000);
}
catch
(InterruptedException
e
) {
//
TODO
Auto-generated catch block
e
.printStackTrace();
}
System.
out
.println(
"变绿灯了, GO GO GO"
);
for
(LightListener
lightListener
:
listeners
) {
lightListener
.onLightChanged(
"Go"
);
}
}
}
}
//观察者
public
class
Car
implements
LightListener{
private
String
name
;
public
Car(String
name
) {
super
();
this
.
name
=
name
;
}
@Override
public
void
onLightChanged(String
data
) {
System.
out
.println(
name
+
data
);
}
}
public
class
Main {
public
static
void
main(String[]
args
) {
TrafficLight
trafficLight
=
new
TrafficLight();
trafficLight
.subscribe(
new
Car(
"兰博基尼"
));
trafficLight
.subscribe(
new
Car(
"玛莎拉蒂"
));
trafficLight
.subscribe(
new
Car(
"凯迪拉克"
));
}
}