Rumah > Java > javaTutorial > Saya telah bekerja selama lima tahun dan saya masih tidak memahami model fasad!

Saya telah bekerja selama lima tahun dan saya masih tidak memahami model fasad!

Lepaskan: 2023-08-28 15:11:34
ke hadapan
910 orang telah melayarinya

. : 4px;margin-kanan: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break : break-all;color: rgb(239, 112, 96);">Mod fasad

.

Diceritakan dengan kisah hidup yang sesuai dan senario projek sebenar
Corak reka bentuk

, dan akhirnya gunakan satu ayat untuk meringkaskan corak reka bentuk ini.

Story门面模式用贴切的生活故事,以及真实项目场景来讲设计模式,最后用一句话来总结这个设计模式。

故事

开发的朋友都知道,后端开发通常都是:

controller---servie---dao/mapper/repository

但是,我问过很多人,熟悉门面模式不?有的工作五年了都不知道。

今天老田,就带你来看看门面模式。

门面模式概述

门面模式(Facade Pattern

Rakan pembangunan semua tahu bahawa pembangunan back-end biasanya:

controller---servie---dao/mapper/repository🎜

🎜 Walau bagaimanapun, saya telah bertanya ramai orang, adakah mereka biasa dengan model fasad? Sesetengah orang telah bekerja selama lima tahun dan tidak tahu. 🎜🎜Hari ini, Lao Tian akan menunjukkan kepada anda mod fasad. 🎜

🎜Gambaran keseluruhan mod fasad🎜 🎜

🎜Mod muka depan (Corak Fasad), juga dipanggil mod penampilan, menyediakan antara muka bersatu untuk mengakses sekumpulan antara muka subsistem. Ciri utamanya ialah ia mentakrifkan antara muka peringkat tinggi untuk menjadikan subsistem lebih mudah digunakan, dan ia tergolong dalam corak reka bentuk struktur. 🎜🎜Bahasa Inggeris:🎜

Sediakan antara muka bersatu kepada satu set antara muka dalam asubsistem Fasad mentakrifkan antara muka peringkat lebih tinggi yang menjadikan subsistem lebih mudah digunakan

Malah, dalam kerja pengekodan harian kami, kami semua menggunakan corak muka depan secara meluas, dengan sengaja. atau tidak sengaja. Apabila modul peringkat tinggi perlu menjadualkan berbilang subsistem (lebih daripada 2 objek kelas), kami secara sedar akan mencipta kelas baharu untuk merangkum subsistem ini dan menyediakan antara muka yang diperkemas supaya modul peringkat tinggi boleh memanggil fungsi-fungsi ini dengan lebih mudah secara tidak langsung. subsistem.

Kes dalam hidup

Mengenai model fasad, terdapat banyak kes dalam kehidupan.

Kes 1: Apabila anda pergi ke bank untuk mengendalikan perniagaan, terdapat meja depan untuk menerima anda Kemudian, meja depan akan bertanya kepada anda perniagaan apa yang anda perlu lakukan, dan dia akan membawa anda melaluinya satu persatu. supaya kita tidak perlu bersiar-siar dan mencari tetingkap perniagaan yang sepadan. Kakitangan meja depan ini adalah setara dengan model fasad.

Kes 2: Bila kita bina rumah, kalau tak ada kontraktor, kena cari sendiri pekerja simen, juruelektrik, tukang hiasan dll. Tetapi jika anda mempunyai kontraktor, anda tidak perlu melakukan apa-apa tugas ini. Anda boleh memberitahu kontraktor secara langsung bahawa anda memerlukan juruelektrik untuk membaiki pendawaian. Kontraktor ini boleh difahami sebagai model fasad.

Kes 3: controller,也可以理解为门面模式,比如说获取用户账户信息,先查UserService获取用户信息,然后查UserAccountServiceMaklumat akaun pengguna yang dibangunkan oleh bahagian belakang kami.

Senario yang boleh digunakan untuk mod fasad

Dalam sistem perisian, mod fasad sesuai untuk senario aplikasi berikut.

  • Menyediakan antara muka yang mudah untuk akses luaran kepada modul atau subsistem yang kompleks.
  • Apabila anda ingin meningkatkan kebebasan subsistem.
  • Apabila subsistem mungkin mengalami pepijat atau masalah berkaitan prestasi disebabkan oleh sebab sementara yang tidak dapat dielakkan, antara muka peringkat tinggi boleh disediakan melalui mod fasad untuk mengasingkan interaksi langsung antara klien dan subsistem untuk mengelakkan pencemaran kod. .
  • Senario perniagaan: Kini anda perlu memanggil kaedah masing-masing bagi tiga perkhidmatan:
public class ServiceA {
    public void doA(){
        System.out.println("do ServiceA");
    }
}
public class ServiceB {
    public void doB(){
        System.out.println("do ServiceB");
    }
}

public class ServiceC {
    public void doC(){
        System.out.println("do ServiceC");
    }
}
Salin selepas log masuk

Apabila mod fasad tidak diperkenalkan, pelanggan memanggilnya seperti ini:
public class Client {
    public static void main(String[] args) {
        ServiceA serviceA=new ServiceA();
        ServiceB serviceB=new ServiceB();
        ServiceC serviceC=new ServiceC();

        serviceA.doA();
        serviceB.doB();
        serviceC.doC();
    }
}
Salin selepas log masuk
Setiap kali, pelanggan perlu mencipta banyak objek perkhidmatan. Jika terdapat banyak perkhidmatan yang terlibat, tidakkah kod ini menjadi janggal? Akan ada banyak kod berulang. Hasil berjalan
do ServiceA
do ServiceB
do ServiceC
Salin selepas log masuk
Salin selepas log masuk
Jom sertai sekarang

:

public class Facade {
    //是不是很像我们controller里注入各种service?
    private ServiceA serviceA = new ServiceA();
    private ServiceB serviceB = new ServiceB();
    private ServiceC serviceC = new ServiceC();

    public void doA() {
        serviceA.doA();
    }

    public void doB() {
        serviceB.doB();
    }

    public void doC() {
        serviceC.doC();
    }
}
Salin selepas log masuk

Pelanggan menjadi:

public class Client {
    public static void main(String[] args) {
        //轻轻松松的搞定,只需要创建门面这个对象即可
        Facade facade=new Facade();
        facade.doA();
        facade.doB();
        facade.doC();
    }
}
Salin selepas log masuk

Hasil larian:

do ServiceA
do ServiceB
do ServiceC
Salin selepas log masuk
Salin selepas log masuk

Facade mode UML diagram

门面模式

Digabungkan dengan UML ini rajah, lebih mudah untuk memahami corak fasad apabila menyemak kes kakitangan meja depan bank dan kontraktor.

Watak dalam mod fasad


Seperti yang anda boleh lihat daripada gambar di atas, mod fasad terutamanya mengandungi 2 aksara.

  • Watak penampilan (Fasad): Juga dipanggil peranan fasad, ia adalah antara muka luaran bersatu sistem. Facade):也叫作门面角色,是系统对外的统一接口。
  • 子系统角色(Service):可以同时有一个或多个Service。每个Service都不是一个单独的类,而是一个类的集合。Service们并不知道Facade的存在,对于Service们而言,Facade 只是另一个客户端而已(即FacadeServiceAServiceBServiceC
Peranan subsistem (Perkhidmatan ) : Boleh ada satu atau lebih Perkhidmatan</code >. Setiap<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05) ; font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">Perkhidmatan bukan kelas yang berasingan, tetapi koleksi kelas. Perkhidmatan orang tidak tahuKewujudan Facade, untuk Perkhidmatan, Fasad hanyalah pelanggan lain (iaitu FasadgandingServiceA, ServiceB, PerkhidmatanCtelus).

Pelanjutan corak fasad

Kelebihan

● Mengurangkan saling kebergantungan sistem Fikirkan, jika kita tidak menggunakan mod fasad, akses luaran masuk terus ke dalam subsistem, dan terdapat hubungan gandingan yang kuat di antara mereka. Jika anda mati, saya akan mati, dan jika anda hidup, saya akan hidup pergantungan yang kuat adalah hasil reka bentuk sistem Tidak boleh diterima, kemunculan corak fasad menyelesaikan masalah ini dengan baik. 🎜🎜● Fleksibiliti yang dipertingkatkan Pergantungan dikurangkan dan fleksibiliti secara semula jadi meningkat. Tidak kira bagaimana subsistem berubah secara dalaman, selagi ia tidak menjejaskan objek fasad, anda boleh bergerak dengan bebas. 🎜

● 提高安全性   想让你访问子系统的哪些业务就开通哪些逻辑,不在门面上开通的方法,你休想访问到 。

缺点

  • 当增加子系统和扩展子系统行为时,可能容易带来未知风险。
  • 不符合开闭原则。
  • 某些情况下,可能违背单一职责原则

大神们是如何使用的

Spring中也是有大量使用到门面模式,比如说

org.springframework.jdbc.support.JdbcUtils
Salin selepas log masuk

再来看看其中的方法

public static void closeConnection(@Nullable Connection con) {
    con.close();
}
public static Object extractDatabaseMetaData(DataSource dataSource, DatabaseMetaDataCallback action)
   throws MetaDataAccessException {
    Connection con = null;
  try {
   con = DataSourceUtils.getConnection(dataSource);
   DatabaseMetaData metaData = con.getMetaData();
   if (metaData == null) {
      //.....
   }
   return action.processMetaData(metaData);
  }
}
......
Salin selepas log masuk

都是给我封装好了方法,对于我们开发者来说,我只面向JdbcUtils这一个类就好了,我不用去管ConnectionResultSet等是怎么创建的,需要的时候,我调用JdbcUtils的对应方法即可获得对应的对象。

Mybatis中也是用到了门面模式,比如:

org.apache.ibatis.session.Configuration
Salin selepas log masuk

Configuration中以new开头的方法,比如:

public Executor newExecutor(Transaction transaction) {
    return newExecutor(transaction, defaultExecutorType);
}
public MetaObject newMetaObject(Object object) {
    return MetaObject.forObject(object, objectFactory, objectWrapperFactory, reflectorFactory);
}

public ParameterHandler newParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {
    ...
    return parameterHandler;
}

public ResultSetHandler newResultSetHandler(Executor executor, MappedStatement mappedStatement, RowBounds rowBounds, ParameterHandler parameterHandler,
      ResultHandler resultHandler, BoundSql boundSql) {
   ...
    return resultSetHandler;
}

public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement){
   ...
}
Salin selepas log masuk

对于调用这些方法的地方,他并不知道是怎么new出来的对象,只管使用就行了。

Tomcat中也有门面模式,比如:

org.apache.catalina.connector.RequestFacade
Salin selepas log masuk

从名字就知道它用了门面模式。它封装了非常多的request操作,也整合了很多servlet-api以外的内容,给用户使用提供了很大便捷。同样,Tomcat针对ResponseSession也封装了对应的ResponseFacade类和StandardSessionFacade类,感兴趣的小伙伴可以深入了解一下。

PS:基本上所有以Facade结尾的类,都是使用到了门面模式。

Rujukan: Kursus corak reka bentuk Tom

Ringkasan

Baiklah, saya telah berkongsi banyak tentang mod fasad ini, adakah anda merasakan bahawa mod fasad adalah sangat mudah. dan ia juga boleh digunakan di tempat kerja? Pertimbangkan sama ada anda boleh menggunakannya, dan pada masa yang sama, anda juga boleh menggunakannya untuk bercakap besar semasa temuduga.

Atas ialah kandungan terperinci Saya telah bekerja selama lima tahun dan saya masih tidak memahami model fasad!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:Java后端技术全栈
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan