java開發(fā)設(shè)計模式
java開發(fā)設(shè)計模式2
-
單例模式
是一種常用的軟件設(shè)計模式,在它的核心結(jié)構(gòu)中值包含一個被稱為單例的特殊類。一個類只有一個實例栖袋,即一個類只有一個對象實例益缎。
package design.pattern;
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
singleton = new Singleton();
}
}
return singleton;
}
}
-
工廠模式
根據(jù)需要返回我們的對象签孔。應(yīng)用比較熟悉的場景就是spring配置文件了绪囱。
package design.pattern;
public class MyFactory {
public static final int TYPE_MI = 1;// 大米
public static final int TYPE_YU = 2;// 油
public static final int TYPE_SC = 3;// 蔬菜
public static Food getFoods(int foodType) {
switch (foodType) {
case TYPE_MI:
return new DaMi();
case TYPE_YU:
return new You();
case TYPE_SC:
default:
return new ShuCai();
}
}
}
abstract class Food {
}
class DaMi extends Food {
}
class You extends Food {
}
class ShuCai extends Food {
}
-
適配器模式
將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口另假。通俗地講绪抛,就是在2個類之間做了一個銜接资铡。比如你在調(diào)用A類的doSomething方法,實際上內(nèi)部實現(xiàn)調(diào)用了B類的doSomething方法幢码。
package design.pattern;
public class MyAdapter {
private MyAdapterImpl adapterImpl;
public MyAdapter(MyAdapterImpl myAdapterImpl) {
this.adapterImpl = myAdapterImpl;
}
public void doSomething() {
adapterImpl.doSomething();
}
public static void main(String args[]) {
new MyAdapter(new MyAdapterImpl()).doSomething();
}
}
class MyAdapterImpl {
public void doSomething() {
}
}
-
代理模式
它的定義是:代理模式給某一個對象提供一個代理對象笤休,并由代理對象控制對原對象的引用。Java的反射機制症副,很多地方就用了代理模式來實現(xiàn)店雅。
package design.pattern;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicProxyMain {
public static void main(String[] args) {
Person smallPerson = new Child();
Person proxyBuyHouse = (Person) Proxy.newProxyInstance(Person.class.getClassLoader(),
new Class[] { Person.class }, new DynamicProxyHandler(smallPerson));
proxyBuyHouse.eat();
}
}
interface Person {
void eat();
}
class Child implements Person {
@Override
public void eat() {
// 小孩吃什么
System.out.println("eating");
}
}
class DynamicProxyHandler implements InvocationHandler {
private Object object;
public DynamicProxyHandler(final Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("調(diào)用前日志監(jiān)控");
Object result = method.invoke(object, args);
System.out.println("調(diào)用后日志監(jiān)控");
return result;
}
}
-
監(jiān)聽模式
當(dāng)事件源觸發(fā)某種行為,會自動執(zhí)行事件監(jiān)聽器里面相應(yīng)的方法贞铣。
Java監(jiān)聽模式右三個部分組成:事件源闹啦、事件對象、事件監(jiān)聽器辕坝。
package design.pattern;
public class ListenerTest {
public static void main(String[] args) {
MyListener myListener = new MyListener();
MyPerson person = new MyPerson();
person.addEatListener(myListener);
person.eat();
}
}
//事件源
class MyPerson{
private Listener listener;//監(jiān)聽器引用
//給事件源添加監(jiān)聽器
public void addEatListener(Listener listener) {
this.listener = listener;
}
public void eat() {
//吃了很多
if(listener != null) {
Event event=new Event() ;
event.setPerson(this);
listener.isThinking(event);//監(jiān)聽吃飯時窍奋,想了什么
}
}
}
//事件
class Event {
private MyPerson person;// 事件源的引用
public MyPerson getPerson() {
return person;
}
public void setPerson(MyPerson person) {
this.person = person;
}
}
interface Listener {
public void isThinking(Event event);
}
class MyListener implements Listener {
@Override
public void isThinking(Event event) {
System.out.println(" is isThinking many things !");
}
}
-
裝飾器模式
簡單說就是不改變現(xiàn)有類的結(jié)構(gòu)前提下,擴展它的功能。用別的類來增加原有類的功能琳袄。
package design.pattern;
public class MyDecorator {
public static void main(String[] args) {
Animal animal= new SmallDog(new Pet());
animal.eat();
}
}
interface Animal {
public void eat();
}
class Pet implements Animal {
@Override
public void eat() {
System.out.println("eat food");
}
}
class Dog implements Animal{
protected Animal animal;
public Dog(Animal animal) {
this.animal = animal;
}
@Override
public void eat() {
this.animal.eat();
}
}
class SmallDog extends Dog{
public SmallDog(Animal animal) {
super(animal);
}
public void eat() {
System.out.println("eat other food ");
this.animal.eat();
}
}
設(shè)計模式的六大原則
1江场、開閉原則(Open Close Principle)
開閉原則就是對功能擴展開放,對修改代碼關(guān)閉窖逗。系統(tǒng)擴展功能是址否,不需要修改原來的代碼,只需新增代碼便可碎紊。
2佑附、里氏代換原則(Liskov Substitution Principle)
里氏代換原則(Liskov Substitution Principle LSP)面向?qū)ο笤O(shè)計的基本原則之一。 里氏代換原則中說矮慕,能使用父類的地方一定可以使用子類替代。 LSP是繼承復(fù)用的基石啄骇,里氏代換原則是對“開-閉”原則的補充痴鳄。
3、依賴倒轉(zhuǎn)原則(Dependence Inversion Principle)
是開閉原則的基礎(chǔ)缸夹,具體內(nèi)容:實現(xiàn)接口編程痪寻,依賴于抽象類或接口而不依賴于具體類,系統(tǒng)功能擴展時可以使用具體類擴展虽惭。
4橡类、接口隔離原則(Interface Segregation Principle)
使用多個隔離的接口,比使用單個接口要好芽唇,原則是:降低依賴顾画,降低耦合。
5匆笤、迪米特法則(最少知道原則)(Demeter Principle)
最少知道原則研侣,就是說:一個實體應(yīng)當(dāng)盡量少的與其他實體之間發(fā)生相互作用,使得系統(tǒng)功能模塊相對獨立炮捧。
6庶诡、合成復(fù)用原則(Composite Reuse Principle)
原則是盡量使用合成/聚合的方式,而不是使用繼承咆课。