"Halo, kanca!"

"Hai, Bilaabo!"

"Kita isih duwe sawetara wektu, mula aku bakal ngandhani babagan telung pola maneh."

"Telu maneh? Ana pira kabeh?"

"Saiki ana puluhan pola populer, nanging jumlah «solusi sing sukses» ora ana watesan."

"Aku weruh. Dadi aku kudu sinau sawetara rolas pola?"

"Nganti sampeyan duwe pengalaman program nyata, dheweke ora bakal menehi sampeyan akeh."

"Sampeyan luwih apik entuk pengalaman luwih sethithik, banjur, ing setahun, bali menyang topik iki lan nyoba mangertos luwih jero. Paling ora sawetara rolas pola desain sing paling populer."

"Iku dosa ora nggunakake pengalaman wong liya lan malah invent soko kanggo kaping 110th."

"Aku setuju."

"Banjur ayo miwiti."

Pola adaptor (utawa pambungkus).

Pola: Adaptor, Proxy, Bridge - 1

"Mbayangno yen sampeyan teka ing China lan nemokake yen stopkontak listrik ngetutake standar sing beda. Bolongan ora bunder, nanging warata. Ing kasus iki, sampeyan butuh adaptor."

"Sesuatu sing padha uga bisa kedadeyan ing program. Kelas beroperasi ing antarmuka sing padha nanging beda. Dadi, kita kudu nggawe adaptor ing antarane.

"Iki rupane:"

Tuladha
interface Time
{
 int getSeconds();
 int getMinutes();
 int getHours();
}

interface TotalTime
{
 int getTotalSeconds();
}

"Upami kita duwe rong antarmuka: Wektu  lan  TotalTime ."

"Antarmuka Wektu ngidini sampeyan entuk wektu saiki nggunakake metode getSeconds (),  getMinutes () lan  getHours ().

" Antarmuka TotalTime ngidini sampeyan entuk jumlah detik sing wis liwati saka tengah wengi nganti saiki."

"Apa sing kudu ditindakake yen kita duwe obyek TotalTime , nanging kita butuh obyek Wektu utawa kosok balene?"

"Kita bisa nulis kelas adaptor kanggo iki. Contone: "

Tuladha
 class TotalTimeAdapter implements Time
{
 private TotalTime totalTime;
 public TotalTimeAdapter(TotalTime totalTime)
 {
  this.totalTime = totalTime;
 }

 int getSeconds()
 {
  return totalTime.getTotalSeconds() % 60; // seconds
 }

 int getMinutes()
 {
  return totalTime.getTotalSeconds() / 60; // minutes
 }

 int getHours()
 {
  return totalTime.getTotalSeconds() / (60 * 60); // hours
 }
}
 
Panggunaan
TotalTime totalTime = TimeManager.getCurrentTime();
Time time = new TotalTimeAdapter(totalTime);
System.out.println(time.getHours() + " : " + time.getMinutes () + " : " +time.getSeconds());

"Lan adaptor ing arah liyane:"

Tuladha
class TimeAdapter implements TotalTime
{
 private Time time;
 public TimeAdapter(Time time)
 {
  this.time = time;
 }

 int getTotalSeconds()
 {
  return time.getHours() * 60 * 60 + time.getMinutes() * 60 + time.getSeconds();
 }
}
Panggunaan
Time time = new Time();
TotalTime totalTime = new TimeAdapter(time);
System.out.println(time.getTotalSeconds());

"Ah. Aku seneng. Nanging apa ana conto?"

"Mesthi! Minangka conto, InputStreamReader minangka adaptor klasik. Ngonversi InputStream dadi Reader."

"Kadhangkala pola iki uga disebut wrapper, amarga kelas anyar 'bungkus' obyek liyane."

"Sampeyan bisa maca sawetara liyane menarik kene ."

Pola proxy

"Pola proxy iku rada padha karo pola pambungkus. Nanging tujuane ora kanggo ngowahi antarmuka, nanging kanggo ngontrol akses menyang obyek asli sing disimpen ing kelas proxy. Kajaba iku, kelas asli lan proxy biasane duwe antarmuka sing padha. sing nggawe luwih gampang kanggo ngganti obyek saka kelas asli karo obyek proxy."

"Tuladhane:"

Antarmuka kelas nyata
interface Bank
{
 public void setUserMoney(User user, double money);
 public int getUserMoney(User user);
}
Implementasi kelas asli
class CitiBank implements Bank
{
 public void setUserMoney(User user, double money)
 {
  UserDAO.updateMoney(user, money);
 }

 public int getUserMoney(User user)
 {
  return UserDAO.getMoney(user);
 }
}
Implementasi kelas proxy
class BankSecurityProxy implements Bank
{
 private Bank bank;
 public BankSecurityProxy(Bank bank)
 {
  this.bank = bank;
 }
 public void setUserMoney(User user, double money)
 {
  if (!SecurityManager.authorize(user, BankAccounts.Manager))
  throw new SecurityException("User can’t change money value");

  bank.setUserMoney(user, money);
 }

 public int getUserMoney(User user)
 {
  if (!SecurityManager.authorize(user, BankAccounts.Manager))
  throw new SecurityException("User can’t get money value");

  return bank.getUserMoney(user);
 }
}

"Ing conto ing ndhuwur, kita nerangake antarmuka Bank lan kelas CitiBank , implementasi antarmuka iki."

"Antarmuka ngidini sampeyan entuk utawa ngganti imbangan akun pangguna."

Banjur kita nggawe BankSecurityProxy , sing uga ngetrapake antarmuka Bank lan nyimpen referensi menyang antarmuka Bank sing beda. Cara kelas iki mriksa apa pangguna minangka pemilik akun utawa manajer bank. Yen ora, banjur SecurityException dibuwang."

"Iki cara kerjane ing praktik:"

Kode tanpa mriksa keamanan:
User user = AuthManager.authorize(login, password);
Bank bank = BankFactory.createUserBank(user);
bank.setUserMoney(user, 1000000);
Kode kanthi mriksa keamanan:
User user = AuthManager.authorize(login, password);
Bank bank = BankFactory.createUserBank(user);
bank = new BankSecurityProxy(bank);
bank.setUserMoney(user, 1000000);

"Ing conto pisanan, kita nggawe obyek bank lan nelpon metode setUserMoney .

"Ing conto kapindho, kita Lebokake obyek bank asli ing obyek BankSecurityProxy . The duwe antarmuka sing padha, supaya kode sakteruse terus bisa kaya. Nanging saiki mriksa keamanan bakal dileksanakake saben wektu cara disebut."

"Keren!"

"Ya, sampeyan bisa duwe akeh proxy kaya ngono. Contone, sampeyan bisa nambah proxy liyane sing mriksa apa imbangan akun gedhe banget. Manajer bank bisa mutusake kanggo nyelehake dhuwit akeh ing akun dhewe lan mlayu menyang Kuba kanthi dana. ."

"Apa maneh ... Nggawe kabeh ranté obyek kasebut bisa dilebokake ing kelas BankFactory , ing ngendi sampeyan bisa ngaktifake / mateni sing sampeyan butuhake."

" BufferedReader dianggo nggunakake prinsip padha. Iku Reader , nanging nindakake karya tambahan."

"Pendekatan iki ngidini sampeyan «ngumpul» obyek kanthi fungsi sing dibutuhake saka macem-macem «potongan».

"Oh, aku meh lali. Proksi digunakake luwih akeh tinimbang sing daktuduhake. Sampeyan bisa maca babagan panggunaan liyane ing kene ."

Pola jembatan

Pola: Adaptor, Proxy, Bridge - 2

"Kadhangkala minangka program mlaku perlu Ngartekno ngganti fungsi obyek. Contone, Upaminipun sampeyan duwe game karo karakter kuldi sing mengko dadi naga dening mage a. Naga wis prilaku temen beda lan sifat, nanging iku. obyek sing padha!"

"Apa kita ora bisa nggawe obyek anyar lan rampung?"

"Ora mesthi, umpamane kuldi sampeyan kanca karo akeh karakter, utawa bisa uga ana ing pengaruh sawetara mantra, utawa melu nggoleki tartamtu. Ing tembung liya, obyek kasebut bisa uga digunakake ing pirang-pirang panggonan - lan disambung menyang akeh obyek liyane. Dadi ing kasus iki, iku dudu pilihan kanggo mung nggawe obyek anyar."

"Inggih, apa sing bisa ditindakake?"

"Pola Bridge minangka salah sawijining solusi sing paling sukses."

"Pola iki mbutuhake pamisah obyek dadi rong obyek: "obyek antarmuka" lan "obyek implementasi".

"Apa bedane antarmuka lan kelas sing ngetrapake?"

"Kanthi antarmuka lan kelas, kita mungkasi karo siji obyek. Nanging ing kene - kita duwe loro. Deleng conto iki: "

Tuladha
class User
{
 private UserImpl realUser;

 public User(UserImpl impl)
 {
  realUser = impl;
 }

 public void run() //Run
 {
  realUser.run();
 }

 public void fly() //Fly
 {
  realUser.fly();
 }
}

class UserImpl
{
 public void run()
 {
 }

 public void fly()
 {
 }
}

"Lan sampeyan bisa ngumumake sawetara subclass UserImpl, contone UserDonkey (kuldi) lan UserDragon (naga)."

"Kabeh padha, aku ora ngerti carane iki bakal bisa."

"Lha, kaya iki:"

Tuladha
class User
{
 private UserImpl realUser;

 public User(UserImpl impl)
 {
  realUser = impl;
 }

 public void transformToDonkey()
 {
  realUser = new UserDonkeyImpl();
 }

 public void transformToDragon()
 {
  realUser = new UserDragonImpl();
 }
}
Cara kerjane
User user = new User(new UserDonkey()); // Internally, we're a donkey
user.transformToDragon(); // Now we're a dragon internally

"Dadi kaya proxy."

"Ya, nanging ing proxy, obyek utama bisa disimpen ing endi wae kanthi kapisah, lan kode kasebut bisa digunakake karo proxy. Ing kene kita ujar manawa kabeh wong bisa nggarap obyek utama, nanging bagean kasebut ganti internal."

"Ah. Thanks. Apa sampeyan bakal menehi kula link kanggo maca liyane babagan?"

"Mesthine, Amigo, kancaku. Iki sampeyan: Pola jembatan ."