Key Points:
1. The adapter pattern is mainly used when "you want to reuse some existing classes, but the interface is inconsistent with the requirements of the reuse environment." It is very useful in legacy code reuse, class library migration, etc.
2. The adapter pattern has two implementation structures: object adapter and class adapter. However, the class adapter adopts the "multiple inheritance" implementation method, which brings undesirable high coupling, so it is generally not recommended. The object adapter adopts the "object combination" method, which is more in line with the spirit of loose coupling.
Implementation:
Class adapter pattern structure diagram (inheritance)
Object’s adapter pattern structure diagram (composition)
(Code implementation of object adapter)
Target: Define the interfaces used by the Client related to specific fields
<span>public</span> <span>interface</span> Target { <span>void</span> request();}
Adaptee: The existing interface that needs to be adapted now
<span>public</span> <span>class</span> Adaptee{ <span>public</span> <span>void</span> specificRequest(){}}
Adapter: Adapt the Adaptee interface and the Target interface
<span>public</span> <span>class</span> Adapter <span>implements</span> Target{ <span>public</span> Adapter(Adaptee adaptee) { <span>super</span>(); <span>this</span>.adaptee = adaptee; } <span>public</span> <span>void</span> request() { adaptee.specificRequest(); } <span>private</span> Adaptee adaptee;}
Applicability:
1. The system needs to use existing classes, but the interface of this class does not meet the needs of the system.
2. Want to create a reusable class that can be used to work with some classes that are not closely related to each other, including some classes that may be introduced in the future. These source classes do not necessarily have complex interfaces.
3. (For object adapters) In the design, it is necessary to change the interfaces of multiple existing subclasses. If you use the class adapter pattern, you have to make an adapter for each subclass, which is not practical. .
Effects, advantages and disadvantages:
For class adapters:
1. Use a specific Adapter class to match Adaptee and Target. The result is that when we want to match a class and all its subclasses, the class Adapter will not do the job.
2. Allow Adapter to override (redefine) some behaviors of Adaptee, because Adapter is a subclass of Adaptee.
For object adapter:
1. Allow an Adapter to work with multiple Adaptee at the same time, that is, the Adaptee itself and all its subclasses (if there are subclasses). Adapter can also add functions to all Adaptees at once.
2. Makes it difficult to override (redefine) the behavior of Adaptee. If you must override the Adaptee method, you have to first make a subclass of Adaptee to override the Adaptee method, and then use this subclass as the real Adaptee source for adaptation.