結(jié)構(gòu)型模式
類或者對象按照一定布局組成更大的對象。類結(jié)構(gòu)模式采用繼承接口,對象模式采用組合或聚合來組合對象扳躬。
結(jié)構(gòu)型模式中除了適配器外锅减,其余都是對象模式
一糖儡、代理模式
- 代理模式在客戶端和目標(biāo)對象之間起到中介和保護(hù)作用
- 優(yōu)點:中介可以擴(kuò)展目標(biāo)對象功能、解耦
- 缺點:增加代理影響性能怔匣,增加復(fù)雜度
抽象主題 Abstract Subject
接口或者抽象類定義真實主題和代理對象實現(xiàn)的方法
interface AbstractSubject{
void request();
}
真實主題 Concrete subject
實現(xiàn)抽象主題具體接口
class ConcreteSubject implement AbstractSubject{
void request(){
System.out.println("處理請求");
}
}
代理類 Proxy
提供真實主題相同的接口握联,內(nèi)部包括真實主題的引用,可以訪問每瞒、控制金闽、擴(kuò)展真實主題功能。
class Proxy implements AbstractSubject{
private ConcreteSubject realSub;
public request(){
if(null==realSub){
realSub=new ConcreteSubject();
}
preRequest();
realSub.request();
posRequest();
}
private void preRequest(){
System.out.println("調(diào)用前");
}
private void PosRequest(){
System.out.println("調(diào)用后");
}
}
調(diào)用類
class TestProxy{
public static void mian(String[] args){
Proxy pro=new Proxy();
pro.request();
}
}
代理模式擴(kuò)展-動態(tài)代理 DynamicProxy
JDK動態(tài)代理依賴接口剿骨,可以沒有實現(xiàn)類
抽象主題
interface AbstractDynamicSubject{
void request();
}
真實主題
class DynamicSubject implements AbstractDynamicSubject{
void request(){
System.out.println("dynamicSubject");
}
}
執(zhí)行處理類 InvocationHandler
class MyInvocationHandler implements InvocationHandler{
@Override
public Object invok(Object proxy,Method method,Object[] arg) throw ThrowAble{
System.out.print("testDynamicProxy");
return null;
}
}
調(diào)用類
public class TestDynamicProxy{
public static void main(String[] args){
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true");
AbstractDynamicSubject proxySubject= (AbstractDynamicSubject) Proxy.newProxyInstance(DynamicSubject.class.getClassLoad(),DynamicSubject
.class.getInterfaces(),new MyInvocationHandler());
}
}
二代芜、適配器模式
將類的接口轉(zhuǎn)換為客戶希望的另一個接口,分為類結(jié)構(gòu)模型和對象結(jié)構(gòu)模型浓利,類需要了解組件內(nèi)部細(xì)節(jié)較少使用
適用老的接口使用挤庇,第三方接口匹配
目標(biāo) target
interface Target{
void request();
}
(被)適配者 Adaptee
class Adaptee {
void adapteeRequest(){
System.out.println("adaptee");
}
}
適配器(類) ClassAdapter
class ClassAdapter extends Adaptee implements Target{
void request(){
adapteeRequest();
}
}
對象適配器 ObjectAdapter
class ObjectAdapter implements Target{
private Adaptee ad;
Public ObjectAdapter(Adaptee cad){
ad=cad;
}
void request(){
ad.adapteeRequest();
}
}
調(diào)用類
public class TestAdapter{
public void static main(String[] args){
Target oba=new ObjectAdapter(new ClassAdapter());
oba.request();
}
}
擴(kuò)展,雙向適配器
interface Adpteeinf {
void adpteeRequest();
}
class TwoObjectAdapter implements Adpteeinf,Target{
private Adaptee da;
private Target tg;
public TwoObjectAdapter(Adaptee cda){
da=cda;
}
public TwoObjectAdapter(Target tga){
tg=tga;
}
void request(){
da.adapteeRequest();
}
void adapteeRequest(){
tg.request();
}
}
三荞膘、橋接模式
將抽象和實現(xiàn)分離罚随,使其獨立變化。用組合關(guān)系代替集成關(guān)系來實現(xiàn)羽资,降低了抽象和實現(xiàn)兩個可變維度耦合度淘菩。
當(dāng)一個類有兩種獨立的變化維度,且都需要擴(kuò)展屠升,例如包有顏色潮改、用途兩種維度屬性,且都需要擴(kuò)展變化腹暖。
實現(xiàn)化角色 implementor
interface Implementor {
void operation();
}
具體實現(xiàn)化角色 ConcreterImplement
class ConcreteImplement implements Implementor{
void operation(){
System.out.print("concrete");
}
}
抽象化角色 Abstraction
abstract Abstraction{
private Implementor imp;
public Abstraction(Implementor imp){
this.imp=imp;
}
void operationImp();
}
擴(kuò)展抽象化角色
class ReAbstraction extends Abstraction{
public ReAbstraction(Implementor imp){
super(imp);
}
public void operationImp(){
imp.operation();
System.out.print("Reimp");
}
}
調(diào)用類
public class TestBridge{
public static void main(String[] args){
Implementor imp= new ConcreteImplement();
ReAbstraction reAb=new ReAbstraction(imp);
reAb.operationImp;
}
}
模式擴(kuò)展
有時橋接模式可與適配器模式聯(lián)合使用汇在。
四、裝飾模式 decorator
不改變現(xiàn)有結(jié)構(gòu)的情況下脏答,動態(tài)增加職責(zé)功能糕殉。最著名的應(yīng)用java中的I/O 設(shè)計
例如,Reader增加緩沖區(qū)
BufferedReader in =new BufferedReader(new FileReader("D:\t.text"));
String s=in.readLine();
抽象構(gòu)件 Component
定義接口規(guī)范需要附加職責(zé)的對象
interface Component{
void read();
}
抽象構(gòu)件的實現(xiàn) ConcreteComponent
class ConcreteComponent implements Component{
void read(){
System.out.println("read");
}
}
抽象裝飾 AbstractDecorator
定義需要擴(kuò)展的功能亩鬼,由子類集成實現(xiàn)
abstract Decorator implements Component{
private Component cp;
public Decorator(Component cp){
this.cp=cp;
}
void read(){
cp.read();
}
}
具體抽象裝飾類 ConcreteDecorator
class ConcreteDecorator extends Decorator{
public ContreteDecorator(Component cp){
super(cp);
}
void read(){
super.read();
addFn();
}
private addFn(){
System.out.print("擴(kuò)展功能");
}
}
五、外觀模式 facade
為多個子系統(tǒng)提供統(tǒng)一個一致的接口阿蝶,方便外部訪問雳锋。
降低了子系統(tǒng)與客戶端直接的耦合,是子系統(tǒng)的變化不會影響調(diào)用羡洁。減少了對象
處理的數(shù)目
新增子系統(tǒng)需要修改外觀類和客戶端玷过,違背了開閉原則。
10facde.png
外觀角色 Facade
對子系統(tǒng)提供統(tǒng)一的接口
class Facade{
private SubSys1 s1=new SubSys1();
private SubSys2 s2 =new SubSys2();
void method(){
s1.method1();
s2.method2();
}
}
子系統(tǒng) SubSystem
class SubSys1{
void method1{
System.out.println("print1()");
}
}
class SubSys2{
void method2{
System.out.println("print2()");
}
}
客戶端 TestFacade
class TestFacade{
public static void main(String[] args){
Facade fe=new Facade();
fe.method();
}
}
六筑煮、享元模式 Flyweight
運(yùn)用共享的技術(shù)來有效支撐辛蚊,大量顆粒度的對象復(fù)用。
抽象享元角色 Flyweight
規(guī)范要實現(xiàn)的公共接口真仲,非享元通過接口參數(shù)傳入袋马。
interface Flyweight{
void setUnFlyweight(UnFlyweight uflyweight);
}
具體享元角色 ConcreteFlyweight
class ConcreteFlyweight implements Flyweight{
private String key;
public ConcreteFlyweight(String key){
this.key=key;
}
public void setUnflyweight(Unflyweight uflyweight){
System.out.println("具體享元被調(diào)用");
System.out.println("非享元信息是"+uflyweight.info());
}
}
非享元角色 UnsharedFlyweight
class UnshareFlyweight{
String info;
public UnshareFlyweight(String info){
this.info=info;
}
public String getInfo(){
return info;
}
pblic void setInfo(String info){
this.info=info;
}
}
享元工廠角色 FlyweightFactory
負(fù)責(zé)創(chuàng)建和管理享元角色√徊停客戶請求時返回原有對象或創(chuàng)建新對象飞蛹。
class FlyweightFactory{
private HashMap<String,Flyweight> flyweights=new HashMap<>();
public getFlyweight(String key){
Flyweight flyweight=flyweights.get(key);
if(null==flyweight){
flyweight =new ConcreteFlyweight(key);
flyweights.put(key,flyweight);
}
return flyweight;
}
}
享元模式擴(kuò)展
單純享元模式 、符合享元模式
復(fù)合享元模式 CompositeConcreteFlyweight
public class CompositeCOncreteFlyweight implements Flyweight{
private List<FLyweight> flyweights=new ArraryList<>();
void setFlyweight(UnFlyweight uFlyweight){
System.out.println(uFLyweight.getInfo());
}
public addFlyweight(Flyweight flyweight){
flyweights.add(flyweight);
}
public removeFlyweight(Flyweight flyweight){
flyweights.remove(flyweight);
}
}
七灸眼、組合模式 Composite
將對象組合成樹狀層次結(jié)構(gòu)的模式卧檐,客戶端可以一致底處理單個對象或組合。分為透明式和安全式
安全式為例:
抽象構(gòu)件 Component
abstract Component{
void operat();
}
樹葉構(gòu)件角色 Leaf
class Leaf implements Component{
void operat(){
System.out.print("leaf");
}
}
樹枝構(gòu)件 Composite
class Commposite implements Component{
private ArrayList<Component> leafs =new ArrayList<>();
void operat(){
for(Component leaf:leafs)
System.out.print("composite");
}
public addLeaf(Leaf leaf){
leafs.add(leaf);
}
pbulic remove(Leaf leaf){
leafs.remove(leaf);
}
public List<Component> getChild(){
return leafs;
}
}