Cephe tasarım deseni nedir?


191

Is cepheye diğer sınıfların bir sürü içeren bir sınıf?

Onu tasarım deseni yapan nedir? Benim için normal bir sınıf gibi.

Bana bu Cephe modelini açıklayabilir misiniz ?


7
Her tasarım modeli uygulamada bir grup sınıftır.
Felix Kling

1
Cephe kalıbı, bir sınıfta birden fazla arabirimi gizleyerek kullanımı kolay bir arayüz oluşturur. Bu makalede daha fazla ayrıntı var .
user3199690

bu yazıda iyi açıklanmıştır programmerzdojo.com/java-tutorials/…
rishi007bansod

"Araştırma çabası göstermez" çünkü bu başparmak aşağı gerekiyordu
Roy Truelove

1
@RoyTruelove, ne istersen yap. Soru için destekleyici cevaplar olduğu sürece umursamaz. Soru için destekleyici bir cevap var mı?
kevin

Yanıtlar:


190

Tasarım deseni, tekrar eden bir sorunu çözmenin yaygın bir yoludur. Tüm tasarım modellerindeki sınıflar sadece normal sınıflardır. Önemli olan, nasıl yapılandırıldıkları ve belirli bir sorunu en iyi şekilde çözmek için birlikte nasıl çalıştıklarıdır.

Cephe tasarım modeli karmaşık bir sistem arayüzü kolaylaştırır; çünkü genellikle karmaşık sistemin alt sistemlerini oluşturan tüm sınıflardan oluşur.

Bir dış cephe sistemi karmaşık bilgi kullanıcının korur ve bir ile sağlamaktadır simplified viewolan o easy to use. Ayrıca decouples, sistemi alt sistemlerin ayrıntılarından kullanan ve daha sonra sistemi değiştirmeyi kolaylaştıran kod.

http://www.dofactory.com/Patterns/PatternFacade.aspx

http://www.blackwasp.co.uk/Facade.aspx

Ayrıca, tasarım modellerini öğrenirken önemli olan, hangi modelin verdiğiniz probleminize uyduğunu ve sonra onu uygun şekilde kullanabilmesidir. Bir deseni kötüye kullanmak veya onu bildiğiniz için bazı problemlere uydurmaya çalışmak çok yaygın bir şeydir. Tasarım kalıplarını öğrenirken bu tuzaklardan haberdar olun.


9
@kevin: Bunların ne zaman kullanılacağını bilmek en zor kısımdır. Teoride, kalıplar kolay olabilir, ama imo pratikte zordur. Bunun sadece deneyim olduğunu öğrenebilirsiniz, yani. kodlama, kodlama, kodlama.
Felix Kling

Cephe tasarım modeli ayrıca detay sınıfının uygulanmasını gizlemek ve kamusal api'yi güvenli bir şekilde tedarik etmek için kullanılır.
yebw

29
jquery $ basit arayüzü ve tüm karmaşıklığı gizleyen cephe tasarım desen sadece basit bir örneğidir
Ajay Beniwal

bazıları için gerçek dünya örneği ile bir cephe tasarım deseni arıyor. Bu kısa youtube tutuorial rastladım. faydalı youtu.be/dLjJo2v2re8
Sankar ganesh

Uygulama büyüdükçe tek sistem için birden fazla cephe katmanı olabilir mi?
Jeeva Jsb

100

Wikipedia'nın Cephe deseninin harika bir örneği var.

/* Complex parts */

class CPU {
    public void freeze() { ... }
    public void jump(long position) { ... }
    public void execute() { ... }
}

class Memory {
    public void load(long position, byte[] data) { ... }
}

class HardDrive {
    public byte[] read(long lba, int size) { ... }
}

/* Facade */

class ComputerFacade {
    private CPU processor;
    private Memory ram;
    private HardDrive hd;

    public ComputerFacade() {
        this.processor = new CPU();
        this.ram = new Memory();
        this.hd = new HardDrive();
    }

    public void start() {
        processor.freeze();
        ram.load(BOOT_ADDRESS, hd.read(BOOT_SECTOR, SECTOR_SIZE));
        processor.jump(BOOT_ADDRESS);
        processor.execute();
    }
}

/* Client */

class You {
    public static void main(String[] args) {
        ComputerFacade computer = new ComputerFacade();
        computer.start();
    }
}

6
Bu iyi bir örnektir. Bir müşterinin isterse bir cephedeki tüm adımları bir araya getirebilmesi gerekir, hiçbir şey özel yöntemlerle gizlenmemelidir.
Rob

2
Bu, iyi bir örnek değil, çünkü kullanım durumunu vurgulamıyor. Örnekte, TO'nun söylediği gibi, normal bir sınıf gösterilmektedir. Donanımla ilişkilendirme bir bileşimdir. Wiki'deki örnek için aşırıya kaçabilir, ancak alt modülleri örneklemek yerine bağımlılık enjeksiyonu kullanmak niyeti vurgulayacak ve muhtemelen TO'nun karışıklığından kaçınacaktır.
ManuelSchneid3r

Bu, kavramın kendisini anlamak için binlerce kelimeyi kısaca saran şaşırtıcı bir örnektir. Geri kalanı sadece kişinin sahip olabileceği farklı senaryolarla ilgili ayrıntılardır (elbette bir tasarım deseni asla her senaryoyu kapsayamaz).
Syed

41

Önceki cevapta açıklandığı gibi, tüketen müşteriye basit bir arayüz sağlar. Örneğin: "ESPN'yi izle" amaçlanan işlevdir. Ancak aşağıdaki gibi birkaç adım içerir:

  1. Gerekirse TV'yi açın;
  2. Uydu / kablo işlevlerini kontrol edin;
  3. Gerekirse ESPN'ye geçin.

Ancak cephe bunu basitleştirecek ve sadece istemciye "ESPN izle" işlevini sağlayacaktır.


29

Cephe, sistemin karmaşıklıklarını gizler ve istemciye sisteme erişebileceği bir arabirim sağlar.

public class Inventory {
public String checkInventory(String OrderId) {
    return "Inventory checked";
}
}

public class Payment {
public String deductPayment(String orderID) {
    return "Payment deducted successfully";
}
}


public class OrderFacade {
private Payment pymt = new Payment();
private Inventory inventry = new Inventory();

public void placeOrder(String orderId) {
    String step1 = inventry.checkInventory(orderId);
    String step2 = pymt.deductPayment(orderId);
    System.out
            .println("Following steps completed:" + step1
                    + " & " + step2);
   }
}

public class Client {
       public static void main(String args[]){
         OrderFacade orderFacade = new OrderFacade();
         orderFacade.placeOrder("OR123456");
         System.out.println("Order processing completed");
       }
  }

Alt sistemlerin geçmeden birbirleriyle iletişim kurmasına izin veriliyor OrderFacademu? Örneğinizde, Paymentve Inventory? Arasında
Isuru

19

Kısa ve basit bir açıklama:

  • Cephe modeli, bir alt sistemdeki bir dizi arabirime birleştirilmiş bir arabirim sağlar.
  • Cephe, alt sistemi kullanmayı kolaylaştıran daha üst düzey bir arayüz tanımlar.


Cepheli ve Cephesiz senaryoyu anlamaya çalışın: Parayı accout1'den account2'ye aktarmak istiyorsanız, çağrılacak iki alt sistem hesaptan çekilip hesap2'ye yatırılır.

cepheli ve cephesiz


Basit ve net bir açıklama ve örnek, teşekkürler! Bir alt sistemi neyin tanımladığını da açıklayabilir misiniz? Alt sistem nispeten alakasız alt sınıflardan / işlevlerden oluşabiliyorsa, tanımınız neredeyse her sınıf için geçerlidir. Alt sistemin sınıfları çok sıkı bir şekilde ilişkili olmalı mı, örneğin bir modül veya kütüphane oluşturmak gibi, cepheye cephe diyebilecek mi?
Benni

@Benni Evet, alt sistem (bir sınıf olacaktır) nispeten ilgisiz işlevlerden oluşabilir, ancak cephe hangi belirli işlevleri çağıracağınıza karar verdiğiniz bir sınıftır. Bir "tur paketi" rezervasyonu yapmak, otel, taksi, bir yerde / formda uçuş seçin sonra iç cephe farklı uygun sınıfların işlevlerini çağırır ve size nihai bir sonuç döndürür. Öyle değil mi?
Arun Raaj

10

Bir cephe, diğer birçok sınıfı içeren bir sınıf olarak tanımlanmamalıdır. Aslında bu sınıflar için bir arayüzdür ve sınıfların kullanımını kolaylaştırmalıdır, aksi takdirde cephe sınıfı işe yaramaz.


7

Sorgularınızla ilgili olarak:

Cephe çok fazla sınıf içeren bir sınıf mı?

Evet. Uygulamadaki birçok alt sistem için bir sargıdır.

Onu tasarım deseni yapan nedir? Benim için normal bir sınıf gibi

Tüm tasarım desenleri de normal sınıflardır. @ Unmesh Kondolikar bu soruyu doğru cevapladı.

Bana bu Cephe hakkında açıklayabilir misiniz, ben tasarım desenleri konusunda yeniyim.

GoF'a göre, Cephe tasarım deseni şu şekildedir:

Bir alt sistemdeki bir dizi arabirime birleşik bir arabirim sağlayın. Cephe Kalıbı, alt sistemin kullanımını kolaylaştıran daha üst düzey bir arayüz tanımlar

Cephe modeli tipik olarak zaman kullanılır:

  1. Karmaşık bir sisteme erişmek için basit bir arayüz gereklidir.
  2. Bir alt sistemin soyutlamaları ve uygulamaları sıkı sıkıya bağlıdır.
  3. Katmanlı yazılımların her seviyesine bir giriş noktası gerekir.
  4. Sistem çok karmaşık veya anlaşılması zor.

Cleartrip web sitesinin gerçek bir kelimesini ele alalım .

Bu web sitesi rezervasyon için seçenekler sunar

  1. Uçak
  2. Oteller
  3. Uçuşlar + Oteller

Kod snippet'i:

import java.util.*;

public class TravelFacade{
    FlightBooking flightBooking;
    TrainBooking trainBooking;
    HotelBooking hotelBooking;

    enum BookingType {
        Flight,Train,Hotel,Flight_And_Hotel,Train_And_Hotel;
    }; 

    public TravelFacade(){
        flightBooking = new FlightBooking();
        trainBooking = new TrainBooking();
        hotelBooking = new HotelBooking();        
    }
    public void book(BookingType type, BookingInfo info){
        switch(type){
            case Flight:
                // book flight;
                flightBooking.bookFlight(info);
                return;
            case Hotel:
                // book hotel;
                hotelBooking.bookHotel(info);
                return;
            case Train:
                // book Train;
                trainBooking.bookTrain(info);
                return;
            case Flight_And_Hotel:
                // book Flight and Hotel
                flightBooking.bookFlight(info);
                hotelBooking.bookHotel(info);
                return;
             case Train_And_Hotel:
                // book Train and Hotel
                trainBooking.bookTrain(info);
                hotelBooking.bookHotel(info);
                return;                
        }
    }
}
class BookingInfo{
    String source;
    String destination;
    Date    fromDate;
    Date     toDate;
    List<PersonInfo> list;
}
class PersonInfo{
    String name;
    int       age;
    Address address;
}
class Address{

}
class FlightBooking{
    public FlightBooking(){

    }
    public void bookFlight(BookingInfo info){

    }
}
class HotelBooking{
    public HotelBooking(){

    }
    public void bookHotel(BookingInfo info){

    }
}
class TrainBooking{
    public TrainBooking(){

    }
    public void bookTrain(BookingInfo info){

    }
}

Açıklama:

  1. FlightBooking, TrainBooking and HotelBooking büyük sistemin farklı alt sistemleridir: TravelFacade

  2. TravelFacade aşağıdaki seçeneklerden birine rezervasyon yapmak için basit bir arayüz sunar

    Flight Booking
    Train Booking 
    Hotel Booking
    Flight + Hotel booking 
    Train + Hotel booking
    
  3. TravelFacade'den kitap API'sı dahili olarak alt sistem API'lerini çağırır

    flightBooking.bookFlight
    trainBooking.bookTrain(info);
    hotelBooking.bookHotel(info);
    
  4. Bu şekilde, TravelFacadealt sistem API'lerini açığa çıkarmadan daha basit ve daha kolay API sağlar.

Önemli çıkarımlar : ( Pankaj Kumar'ın Journaldev makalesinden )

  1. Cephe deseni daha çok istemci uygulamaları için bir yardımcı gibidir
  2. Cephe deseni, genellikle arabirim sayısı büyüdüğünde ve sistem x tamamlandığında , herhangi bir geliştirme noktasında uygulanabilir .
  3. Alt sistem arayüzleri Cephe'nin farkında değildir ve Cephe arayüzüne herhangi bir referansları olmamalıdır
  4. Cephe modeli benzer tür arayüzler için uygulanmalıdır , amacı benzer tür işleri yapan çoklu arayüzlerden ziyade tek bir arayüz sağlamaktır

Daha iyi anlamak için kaynak bulma makalesine de bir göz atın .


6

Cephe deseni, daha basit bir arayüz üretmek için birçok diğer arayüzün bir sargısıdır.

Tasarım kalıpları, tekrar eden sorunları çözdüğü ve genel olarak kodu basitleştirdiği için faydalıdır. Aynı kalıpları kullanmayı kabul eden bir geliştirici ekibinde, birbirlerinin kodunu korurken verimliliği ve anlayışı geliştirir.

Daha fazla desen hakkında okumaya çalışın:

Cephe Kalıbı: http://www.dofactory.com/Patterns/PatternFacade.aspx#_self1

veya daha genel olarak: http://www.dofactory.com/Patterns/Patterns.aspx


nileshgule.com/2012/07/facade-design-pattern.html Cephe tasarım şablonunu burada Konut kredisi doğrulama sürecine bir örnekle anlatmaya çalıştım.
Nilesh Gule

6

Cephe kalıbının ek bir kullanımı da ekibinizin öğrenme eğrisini azaltmak olabilir. Sana bir örnek vereyim:

Excel tarafından sağlanan COM nesne modelini kullanarak uygulamanızın MS Excel ile etkileşim kurması gerektiğini varsayalım. Ekip üyelerinizden biri tüm Excel API'lerini bilir ve üstünde uygulamanın tüm temel senaryolarını karşılayan bir Cephe oluşturur. Ekipteki başka hiçbir üyenin Excel API'sini öğrenmek için zaman harcaması gerekmez. Ekip, cepheyi, bir senaryoyu yerine getirmeye dahil olan iç kısımları veya tüm MS Excel nesnelerini bilmeden kullanabilir. Harika değil mi?

Böylece, karmaşık bir alt sistemin üstünde basitleştirilmiş ve birleştirilmiş bir arayüz sağlar.


5

Cephe için başka bir örnek: uygulamanızın veritabanına bağlandığını ve sonuçları kullanıcı arayüzünde görüntülediğini varsayalım. Uygulamayı, veritabanı kullanarak veya sahte nesnelerle çalıştırıldığı gibi yapılandırılabilir hale getirmek için cepheyi kullanabilirsiniz. Böylece, uygulama yapılandırmasını okuyacak ve db sorgusunu başlatmaya veya sahte nesneyi döndürmeye karar vereceği cephe sınıfına tüm veritabanı çağrılarını yapacaksınız. bu şekilde db kullanılamıyorsa uygulama db'den bağımsız hale gelir.


5

Bir cephe, çoğunlukla çağrılan basitleştirilmiş işlevleri ortaya çıkarır ve uygulama, istemcilerin aksi takdirde uğraşması gereken karmaşıklığı gizler. Genel olarak uygulama içinde birden fazla paket, sınıf ve işlev kullanır. İyi yazılmış cepheler diğer sınıflara doğrudan erişimi nadir yapar. Örneğin bir ATM'yi ziyaret ettiğimde ve bir miktar para çektiğimde. ATM, doğrudan sahip olduğu bankaya mı yoksa harici bir banka için müzakere edilmiş bir ağa mı gideceğini gizler. ATM, müşteri olarak doğrudan uğraşmak zorunda olmadığım birden fazla cihaz ve alt sistem tüketen bir cephe görevi görür.


5

Desenin çok iyi bir gerçek yaşam örneği var - Araba marş motoru .

Sürücüler olarak, anahtarı açıyoruz ve araba çalışıyor. Olabildiğince basit. Perde arkasında, otomobilin başarılı bir şekilde başlaması için diğer birçok otomobil sistemi (akü, motor, yakıt vb.) Yer alır, ancak marş motorunun arkasında gizlidirler.

Gördüğünüz gibi, araba marş Cephe. Diğer tüm araç sistemlerinin karmaşıklığı konusunda endişelenmeden, kullanımı kolay bir arayüz sağlar.

Özetleyelim:

Cephe deseni, daha geniş, anlaşılır ve kullanımı kolay bir arayüz sağlayarak büyük kod bloklarının veya API'lerin karmaşıklığını basitleştirir ve gizler.


4

Cephe, bir araç kiti ve eksiksiz bir uygulama arasında yer alan ve bir paket veya alt sistemdeki sınıfların basitleştirilmiş kullanımını sunan bir işlevselliğe sahip bir sınıftır. Cephe modelinin amacı, bir altsistemin kullanımını kolaylaştıran bir arayüz sağlamaktır. - C # kitap Tasarım Desenleri ayıklayın .


4

Cephe, karmaşık bir alt sistemin tek bir arayüz nesnesi içinde kapsüllenmesini tartışır. Bu, alt sistemi başarıyla kullanmak için gerekli öğrenme eğrisini azaltır. Ayrıca, alt sistemin potansiyel olarak birçok istemcisinden ayrılmasını destekler. Öte yandan, Cephe alt sistem için tek erişim noktasıysa, "uzman kullanıcılar" ın ihtiyaç duyabileceği özellikleri ve esnekliği sınırlayacaktır.

Kaynak: https://sourcemaking.com/design_patterns/facade


3

Tasarım deseni, yazılım tasarımında belirli bir bağlamda yaygın olarak ortaya çıkan bir soruna genel yeniden kullanılabilir bir çözümdür.

Cephe tasarım modeli, sınıflar veya varlıklar arasında ilişki yaratmanın bir yolunu tanımladığı için yapısal bir modeldir. Cephe tasarım deseni, daha karmaşık bir alt sistem için basitleştirilmiş bir arayüz tanımlamak için kullanılır.

Cephe modeli, çok sayıda birbirine bağlı sınıfla veya özellikle kullanımı karmaşık olduğunda veya anlaşılması zor olduğunda, birden çok yöntemin kullanılmasını gerektiren sınıflarla çalışırken idealdir. Cephe sınıfı, kolayca anlaşılabilen ve kullanımı kolay bir dizi eleman içeren bir "sargı" dır. Bu üyeler, uygulama ayrıntılarını gizleyerek cephe kullanıcısı adına alt sisteme erişir.

Cephe tasarım deseni, kaynak kodu kullanılamadığı veya mevcut arayüz yaygın olarak kullanıldığı için, kötü tasarlanmış ancak yeniden düzenlenemeyen alt sistemleri sararken özellikle kullanışlıdır. Bazen farklı amaçlar için işlevsellik alt kümeleri sağlamak için birden fazla cephe uygulamaya karar verebilirsiniz.

Cephe modelinin örnek kullanımlarından biri, bir web sitesini bir iş uygulamasına entegre etmektir. Mevcut yazılım, belirli bir şekilde erişilmesi gereken büyük miktarlarda iş mantığı içerebilir. Web sitesi, bu iş mantığına yalnızca sınırlı erişim gerektirebilir. Örneğin, web sitesinin satış için bir ürünün sınırlı bir stok seviyesine ulaşıp ulaşmadığını göstermesi gerekebilir. Cephe sınıfının IsLowStock yöntemi, bunu belirtmek için bir Boolean değeri döndürebilir. Sahne arkasında, bu yöntem mevcut fiziksel stoğu, gelen stoğu, tahsis edilen kalemleri ve her bir kalem için düşük stok seviyesini işlemenin karmaşıklığını gizliyor olabilir.



2

Bu sadece birden fazla yöntemi çağırmak için bir sarıcı oluşturma. X () ve y () yöntemiyle bir A sınıfınız ve k () ve z () yöntemiyle B sınıfınız var. Bir kerede x, y, z çağırmak istiyorsanız, bunu yapmak için Facade desenini kullanarak sadece bir Facade sınıfı oluşturun ve xyz () diyelim bir yöntem oluşturun. Her yöntemi (x, y ve z) tek tek çağırmak yerine, bu yöntemleri çağıran cephe sınıfının sarma yöntemini (xyz ()) çağırmanız yeterlidir.

Benzer desen veri havuzudur, ancak temel olarak veri erişim katmanı içindir.


1

Temelde tek pencere temizleme sistemidir. Herhangi bir çalışmayı başka bir sınıftaki belirli yönteme delege edecektir.



1

Cephe modeli alt sistem arayüz grubuna birleşik bir arayüz sağlar. Cephe, alt sistemle çalışmayı basitleştiren yüksek seviyeli bir arayüz tanımlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.