Tasarım Kalıbı Hızlı Kılavuzu

Tasarım kalıpları, deneyimli nesne yönelimli yazılım geliştiricileri tarafından kullanılan en iyi uygulamaları temsil eder. Tasarım kalıpları, yazılım geliştiricilerin yazılım geliştirme sırasında karşılaştıkları genel sorunlara yönelik çözümlerdir. Bu çözümler, çok sayıda yazılım geliştiricisi tarafından oldukça uzun bir süre boyunca deneme yanılma yoluyla elde edildi.

Gang of Four (GOF) nedir?

1994'te dört yazar Erich Gamma, Richard Helm, Ralph Johnson ve John Vlissides başlıklı bir kitap yayınladı. Design Patterns - Elements of Reusable Object-Oriented Software Yazılım geliştirmede Tasarım Modeli kavramını başlatmıştır.

Bu yazarlar toplu olarak şu şekilde bilinir: Gang of Four (GOF). Bu yazarlara göre tasarım kalıpları öncelikle aşağıdaki nesne yönelimli tasarım ilkelerine dayanmaktadır.

  • Bir arayüze programlayın, bir uygulamaya değil

  • Nesne kompozisyonunu mirasa tercih edin

Tasarım Deseninin Kullanımı

Tasarım Modellerinin yazılım geliştirmede iki ana kullanımı vardır.

Geliştiriciler için ortak platform

Tasarım modelleri standart bir terminoloji sağlar ve belirli bir senaryoya özgüdür. Örneğin, tekli bir tasarım modeli, tek bir nesnenin kullanımını ifade eder, böylece tek tasarım modeline aşina olan tüm geliştiriciler, tek bir nesneyi kullanır ve birbirlerine programın tek bir model izlediğini söyleyebilirler.

En İyi Uygulamalar

Tasarım kalıpları uzun bir süre boyunca gelişmiştir ve yazılım geliştirme sırasında karşılaşılan belirli sorunlara en iyi çözümleri sağlarlar. Bu kalıpları öğrenmek, deneyimsiz geliştiricilerin yazılım tasarımını kolay ve hızlı bir şekilde öğrenmelerine yardımcı olur.

Tasarım Deseni Türleri

Tasarım deseni referans kitabına göre Design Patterns - Elements of Reusable Object-Oriented Software23 tasarım deseni vardır. Bu kalıplar üç kategoride sınıflandırılabilir: Yaratılış, Yapısal ve davranış kalıpları. Ayrıca başka bir tasarım modeli kategorisini de tartışacağız: J2EE tasarım modelleri.

SN Desen ve Açıklama
1 Creational Patterns
Bu tasarım desenleri, nesneleri doğrudan yeni operatör kullanarak somutlaştırmak yerine, oluşturma mantığını gizlerken nesneler oluşturma yolu sağlar. Bu, programa, belirli bir kullanım durumu için hangi nesnelerin oluşturulması gerektiğine karar vermede daha fazla esneklik sağlar.
2 Structural Patterns
Bu tasarım modelleri sınıf ve nesne kompozisyonu ile ilgilidir. Kalıtım kavramı, arayüzler oluşturmak ve yeni işlevler elde etmek için nesneler oluşturmanın yollarını tanımlamak için kullanılır.
3 Behavioral Patterns
Bu tasarım modelleri, özellikle nesneler arasındaki iletişimle ilgilidir.
4 J2EE Patterns
Bu tasarım modelleri, özellikle sunum katmanı ile ilgilidir. Bu modeller Sun Java Center tarafından tanımlanır.

Fabrika deseni, Java'da en çok kullanılan tasarım modellerinden biridir. Bu desen türü, bir nesneyi yaratmanın en iyi yollarından birini sağladığından, bu tür bir tasarım deseni yaratımsal modelin kapsamına girer.

Fabrika modelinde, oluşturma mantığını müşteriye göstermeden nesne oluştururuz ve ortak bir arayüz kullanarak yeni oluşturulan nesneye başvururuz.

Uygulama

Biz oluşturmak için gidiyoruz Şekli arayüzü ve uygulama beton sınıfları Şekli arayüzü. Bir fabrika sınıfı ShapeFactory , sonraki adım olarak tanımlanır.

FactoryPatternDemo , demo sınıfımız bir Shape nesnesi almak için ShapeFactory kullanacaktır . İhtiyaç duyduğu nesne türünü elde etmek için bilgileri ( DAİRE / DİKDÖRTGEN / KARE ) ShapeFactory'ye iletecektir .

Aşama 1

Bir arayüz oluşturun.

Shape.java

public interface Shape {
   void draw();
}

Adım 2

Aynı arayüzü uygulayan somut sınıflar oluşturun.

Rectangle.java

public class Rectangle implements Shape {

   @Override
   public void draw() {
      System.out.println("Inside Rectangle::draw() method.");
   }
}

Square.java

public class Square implements Shape {

   @Override
   public void draw() {
      System.out.println("Inside Square::draw() method.");
   }
}

Circle.java

public class Circle implements Shape {

   @Override
   public void draw() {
      System.out.println("Inside Circle::draw() method.");
   }
}

Aşama 3

Verilen bilgilere dayanarak somut sınıf nesnesi oluşturmak için bir Fabrika oluşturun.

ShapeFactory.java

public class ShapeFactory {
	
   //use getShape method to get object of type shape 
   public Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }		
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();
      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();
      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }
      return null;
   }
}

4. adım

Tür gibi bir bilgi ileterek somut sınıfın nesnesini elde etmek için Fabrikayı kullanın.

FactoryPatternDemo.java

public class FactoryPatternDemo {

   public static void main(String[] args) {
      ShapeFactory shapeFactory = new ShapeFactory();

      //get an object of Circle and call its draw method.
      Shape shape1 = shapeFactory.getShape("CIRCLE");

      //call draw method of Circle
      shape1.draw();

      //get an object of Rectangle and call its draw method.
      Shape shape2 = shapeFactory.getShape("RECTANGLE");

      //call draw method of Rectangle
      shape2.draw();

      //get an object of Square and call its draw method.
      Shape shape3 = shapeFactory.getShape("SQUARE");

      //call draw method of square
      shape3.draw();
   }
}

Adım 5

Çıkışı doğrulayın.

Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.

Özet Fabrika kalıpları, diğer fabrikaları yaratan bir süper fabrika etrafında çalışır. Bu fabrika aynı zamanda fabrika fabrikası olarak da adlandırılır. Bu desen türü, bir nesneyi yaratmanın en iyi yollarından birini sağladığından, bu tür bir tasarım deseni yaratımsal modelin kapsamına girer.

Abstract Factory modelinde bir arayüz, sınıflarını açıkça belirtmeden ilgili nesnelerin bir fabrikasını oluşturmaktan sorumludur. Üretilen her fabrika, nesneleri Fabrika modeline göre verebilir.

Uygulama

Bir Shape arayüzü ve onu uygulayan somut bir sınıf oluşturacağız. Bir sonraki adım olarak AbstractFactory soyut bir fabrika sınıfı oluşturuyoruz. AbstractFactory'yi genişleten fabrika sınıfı ShapeFactory tanımlanmıştır. Bir fabrika yaratıcısı / üretici sınıfı FactoryProducer oluşturulur.

AbstractFactoryPatternDemo, demo sınıfımız bir AbstractFactory nesnesi almak için FactoryProducer'ı kullanır. İhtiyaç duyduğu nesne türünü elde etmek için AbstractFactory'ye bilgileri (ÇEMBER / DİKDÖRTGEN / KARE) geçirecektir.

Aşama 1

Şekiller için bir arayüz oluşturun.

Shape.java

public interface Shape {
   void draw();
}

Adım 2

Aynı arayüzü uygulayan somut sınıflar oluşturun.

RoundedRectangle.java

public class RoundedRectangle implements Shape {
   @Override
   public void draw() {
      System.out.println("Inside RoundedRectangle::draw() method.");
   }
}

RoundedSquare.java

public class RoundedSquare implements Shape {
   @Override
   public void draw() {
      System.out.println("Inside RoundedSquare::draw() method.");
   }
}

Rectangle.java

public class Rectangle implements Shape {
   @Override
   public void draw() {
      System.out.println("Inside Rectangle::draw() method.");
   }
}

Aşama 3

Normal ve Yuvarlak Şekilli Nesneler için fabrikalar elde etmek üzere Soyut bir sınıf oluşturun.

AbstractFactory.java

public abstract class AbstractFactory {
   abstract Shape getShape(String shapeType) ;
}

4. adım

Verilen bilgilere dayalı olarak somut sınıf nesnesi oluşturmak için AbstractFactory'yi genişleten Fabrika sınıfları oluşturun.

ShapeFactory.java

public class ShapeFactory extends AbstractFactory {
   @Override
   public Shape getShape(String shapeType){    
      if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();         
      }else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }	 
      return null;
   }
}

RoundedShapeFactory.java

public class RoundedShapeFactory extends AbstractFactory {
   @Override
   public Shape getShape(String shapeType){    
      if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new RoundedRectangle();         
      }else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new RoundedSquare();
      }	 
      return null;
   }
}

Adım 5

Shape gibi bir bilgiyi ileterek fabrikaları elde etmek için bir Fabrika oluşturucu / üretici sınıfı oluşturun

FactoryProducer.java

public class FactoryProducer {
   public static AbstractFactory getFactory(boolean rounded){   
      if(rounded){
         return new RoundedShapeFactory();         
      }else{
         return new ShapeFactory();
      }
   }
}

6. Adım

Type gibi bir bilgiyi ileterek somut sınıfların fabrikalarını elde etmek için AbstractFactory'yi almak için FactoryProducer'ı kullanın.

AbstractFactoryPatternDemo.java

public class AbstractFactoryPatternDemo {
   public static void main(String[] args) {
      //get shape factory
      AbstractFactory shapeFactory = FactoryProducer.getFactory(false);
      //get an object of Shape Rectangle
      Shape shape1 = shapeFactory.getShape("RECTANGLE");
      //call draw method of Shape Rectangle
      shape1.draw();
      //get an object of Shape Square 
      Shape shape2 = shapeFactory.getShape("SQUARE");
      //call draw method of Shape Square
      shape2.draw();
      //get shape factory
      AbstractFactory shapeFactory1 = FactoryProducer.getFactory(true);
      //get an object of Shape Rectangle
      Shape shape3 = shapeFactory1.getShape("RECTANGLE");
      //call draw method of Shape Rectangle
      shape3.draw();
      //get an object of Shape Square 
      Shape shape4 = shapeFactory1.getShape("SQUARE");
      //call draw method of Shape Square
      shape4.draw();
      
   }
}

7. Adım

Çıkışı doğrulayın.

Inside Rectangle::draw() method.
Inside Square::draw() method.
Inside RoundedRectangle::draw() method.
Inside RoundedSquare::draw() method.

Singleton desen, Java'daki en basit tasarım modellerinden biridir. Bu desen türü, bir nesneyi oluşturmanın en iyi yollarından birini sağladığından, bu tür bir tasarım deseni yaratımsal desenin altına girer.

Bu desen, yalnızca tek bir nesnenin oluşturulmasını sağlarken kendi nesnesini oluşturmaktan sorumlu olan tek bir sınıfı içerir. Bu sınıf, sınıfın nesnesini somutlaştırmaya gerek kalmadan doğrudan erişilebilen tek nesnesine erişmenin bir yolunu sağlar.

Uygulama

Bir SingleObject sınıfı oluşturacağız . SingleObject sınıfının yapıcısı özeldir ve kendisinin statik bir örneğine sahiptir.

SingleObject sınıfı, statik örneğini dış dünyaya götürmek için statik bir yöntem sağlar. SingletonPatternDemo , demo sınıfımız bir SingleObject nesnesi almak için SingleObject sınıfını kullanacaktır .

Aşama 1

Bir Singleton Sınıfı oluşturun.

SingleObject.java

public class SingleObject {

   //create an object of SingleObject
   private static SingleObject instance = new SingleObject();

   //make the constructor private so that this class cannot be
   //instantiated
   private SingleObject(){}

   //Get the only object available
   public static SingleObject getInstance(){
      return instance;
   }

   public void showMessage(){
      System.out.println("Hello World!");
   }
}

Adım 2

Singleton sınıfından tek nesneyi alın.

SingletonPatternDemo.java

public class SingletonPatternDemo {
   public static void main(String[] args) {

      //illegal construct
      //Compile Time Error: The constructor SingleObject() is not visible
      //SingleObject object = new SingleObject();

      //Get the only object available
      SingleObject object = SingleObject.getInstance();

      //show the message
      object.showMessage();
   }
}

Aşama 3

Çıkışı doğrulayın.

Hello World!

Oluşturucu deseni, basit nesneleri kullanarak ve adım adım yaklaşımı kullanarak karmaşık bir nesne oluşturur. Bu desen türü, bir nesneyi yaratmanın en iyi yollarından birini sağladığından, bu tür bir tasarım deseni yaratımsal modelin kapsamına girer.

Bir Builder sınıfı, son nesneyi adım adım oluşturur. Bu kurucu diğer nesnelerden bağımsızdır.

Uygulama

Tipik bir yemeğin hamburger ve soğuk içecek olabileceği bir fast-food restoranının iş durumunu ele aldık. Burger, Veg Burger veya Chicken Burger olabilir ve bir paketleyici ile paketlenecektir. Soğuk içecek kola veya pepsi olabilir ve bir şişeye paketlenir.

Burger ve soğuk içecekler gibi gıda maddelerini temsil eden bir Ürün arayüzü ve Ürün arayüzünü uygulayan bir Paketleme arayüzü ve burger ambalajda ve soğuk olarak paketleneceği için Paketleme arayüzünü uygulayan bir Paketleme arayüzü ve gıda maddelerinin ambalajını temsil eden bir Paketleme arayüzü oluşturacağız içecek şişe olarak paketlenirdi.

Daha sonra bir oluşturmak yemek sınıfı olan ArrayList'in ait Ürün ve MealBuilder farklı türleri oluşturmak için yemek birleştirerek nesne Ürün . BuilderPatternDemo , demo sınıfımız bir Meal oluşturmak için MealBuilder'ı kullanacaktır .

Aşama 1

Gıda maddesi ve paketlemeyi temsil eden bir arayüz Öğesi oluşturun.

Item.java

public interface Item {
   public String name();
   public Packing packing();
   public float price();	
}

Packaging.java

public interface Packing {
   public String pack();
}

Adım 2

Paketleme arayüzünü uygulayarak somut sınıflar oluşturun.

Wrapper.java

public class Wrapper implements Packing {

   @Override
   public String pack() {
      return "Wrapper";
   }
}

Bottle.java

public class Bottle implements Packing {

   @Override
   public String pack() {
      return "Bottle";
   }
}

Aşama 3

Varsayılan işlevler sağlayan öğe arabirimini uygulayan soyut sınıflar oluşturun.

Burger.java

public abstract class Burger implements Item {

   @Override
   public Packing packing() {
      return new Wrapper();
   }

   @Override
   public abstract float price();
}

ColdDrink.java

public abstract class ColdDrink implements Item {

	@Override
	public Packing packing() {
       return new Bottle();
	}

	@Override
	public abstract float price();
}

4. adım

Burger ve ColdDrink sınıflarını genişleten somut sınıflar oluşturun

VegBurger.java

public class VegBurger extends Burger {

   @Override
   public float price() {
      return 25.0f;
   }

   @Override
   public String name() {
      return "Veg Burger";
   }
}

ChickenBurger.java

public class ChickenBurger extends Burger {

   @Override
   public float price() {
      return 50.5f;
   }

   @Override
   public String name() {
      return "Chicken Burger";
   }
}

Coke.java

public class Coke extends ColdDrink {

   @Override
   public float price() {
      return 30.0f;
   }

   @Override
   public String name() {
      return "Coke";
   }
}

Pepsi.java

public class Pepsi extends ColdDrink {

   @Override
   public float price() {
      return 35.0f;
   }

   @Override
   public String name() {
      return "Pepsi";
   }
}

Adım 5

Yukarıda tanımlanan Öğe nesnelerine sahip bir Yemek sınıfı oluşturun.

Meal.java

import java.util.ArrayList;
import java.util.List;

public class Meal {
   private List<Item> items = new ArrayList<Item>();	

   public void addItem(Item item){
      items.add(item);
   }

   public float getCost(){
      float cost = 0.0f;
      for (Item item : items) {
         cost += item.price();
      }		
      return cost;
   }

   public void showItems(){
      for (Item item : items) {
         System.out.print("Item : "+item.name());
         System.out.print(", Packing : "+item.packing().pack());
         System.out.println(", Price : "+item.price());
      }		
   }	
}

6. Adım

Meal nesneleri oluşturmaktan sorumlu gerçek bir oluşturucu sınıfı olan bir MealBuilder sınıfı oluşturun.

MealBuilder.java

public class MealBuilder {

   public Meal prepareVegMeal (){
      Meal meal = new Meal();
      meal.addItem(new VegBurger());
      meal.addItem(new Coke());
      return meal;
   }   

   public Meal prepareNonVegMeal (){
      Meal meal = new Meal();
      meal.addItem(new ChickenBurger());
      meal.addItem(new Pepsi());
      return meal;
   }
}

7. Adım

BuiderPatternDemo, oluşturucu modelini göstermek için MealBuider'ı kullanır.

BuilderPatternDemo.java

public class BuilderPatternDemo {
   public static void main(String[] args) {
      MealBuilder mealBuilder = new MealBuilder();

      Meal vegMeal = mealBuilder.prepareVegMeal();
      System.out.println("Veg Meal");
      vegMeal.showItems();
      System.out.println("Total Cost: " +vegMeal.getCost());

      Meal nonVegMeal = mealBuilder.prepareNonVegMeal();
      System.out.println("\n\nNon-Veg Meal");
      nonVegMeal.showItems();
      System.out.println("Total Cost: " +nonVegMeal.getCost());
   }
}

8. Adım

Çıkışı doğrulayın.

Veg Meal
Item : Veg Burger, Packing : Wrapper, Price : 25.0
Item : Coke, Packing : Bottle, Price : 30.0
Total Cost: 55.0

Non-Veg Meal
Item : Chicken Burger, Packing : Wrapper, Price : 50.5
Item : Pepsi, Packing : Bottle, Price : 35.0
Total Cost: 85.5

Prototip deseni, performansı göz önünde bulundurarak yinelenen nesne oluşturmayı ifade eder. Bu desen türü, bir nesneyi oluşturmanın en iyi yollarından birini sağladığından, bu tür bir tasarım deseni yaratımsal desenin altına girer.

Bu model, mevcut nesnenin bir klonunu oluşturmayı söyleyen bir prototip arayüzünün uygulanmasını içerir. Bu desen, doğrudan nesnenin yaratılması maliyetli olduğunda kullanılır. Örneğin, maliyetli bir veritabanı işleminden sonra bir nesne oluşturulacaktır. Nesneyi önbelleğe alabilir, bir sonraki talepte klonunu geri getirebilir ve veritabanını gerektiği gibi ve gerektiğinde güncelleyerek veritabanı çağrılarını azaltabiliriz.

Uygulama

Shape sınıfını genişleten soyut bir Shape sınıfı ve somut sınıflar oluşturacağız . ShapeCache sınıfı , şekil nesnelerini Hashtable'da depolayan ve istendiğinde klonlarını döndüren bir sonraki adım olarak tanımlanır .

PrototypPatternDemo , demo sınıfımız bir Shape nesnesi almak için ShapeCache sınıfını kullanacaktır .

Aşama 1

Klonlanabilir arabirimi uygulayan soyut bir sınıf oluşturun .

Shape.java

public abstract class Shape implements Cloneable {
   
   private String id;
   protected String type;
   
   abstract void draw();
   
   public String getType(){
      return type;
   }
   
   public String getId() {
      return id;
   }
   
   public void setId(String id) {
      this.id = id;
   }
   
   public Object clone() {
      Object clone = null;
      try {
         clone = super.clone();
      } catch (CloneNotSupportedException e) {
         e.printStackTrace();
      }
      return clone;
   }
}

Adım 2

Yukarıdaki sınıfı genişleten somut sınıflar oluşturun.

Rectangle.java

public class Rectangle extends Shape {

   public Rectangle(){
     type = "Rectangle";
   }

   @Override
   public void draw() {
      System.out.println("Inside Rectangle::draw() method.");
   }
}

Square.java

public class Square extends Shape {

   public Square(){
     type = "Square";
   }

   @Override
   public void draw() {
      System.out.println("Inside Square::draw() method.");
   }
}

Circle.java

public class Circle extends Shape {

   public Circle(){
     type = "Circle";
   }

   @Override
   public void draw() {
      System.out.println("Inside Circle::draw() method.");
   }
}

Aşama 3

Veritabanından somut sınıflar almak ve bunları bir Hashtable'da depolamak için bir sınıf oluşturun .

ShapeCache.java

import java.util.Hashtable;

public class ShapeCache {
	
   private static Hashtable<String, Shape> shapeMap 
      = new Hashtable<String, Shape>();

   public static Shape getShape(String shapeId) {
      Shape cachedShape = shapeMap.get(shapeId);
      return (Shape) cachedShape.clone();
   }

   // for each shape run database query and create shape
   // shapeMap.put(shapeKey, shape);
   // for example, we are adding three shapes
   public static void loadCache() {
      Circle circle = new Circle();
      circle.setId("1");
      shapeMap.put(circle.getId(),circle);

      Square square = new Square();
      square.setId("2");
      shapeMap.put(square.getId(),square);

      Rectangle rectangle = new Rectangle();
      rectangle.setId("3");
      shapeMap.put(rectangle.getId(),rectangle);
   }
}

4. adım

PrototypePatternDemo , Hashtable'da depolanan şekillerin klonlarını almak için ShapeCache sınıfını kullanır .

PrototypePatternDemo.java

public class PrototypePatternDemo {
   public static void main(String[] args) {
      ShapeCache.loadCache();

      Shape clonedShape = (Shape) ShapeCache.getShape("1");
      System.out.println("Shape : " + clonedShape.getType());		

      Shape clonedShape2 = (Shape) ShapeCache.getShape("2");
      System.out.println("Shape : " + clonedShape2.getType());		

      Shape clonedShape3 = (Shape) ShapeCache.getShape("3");
      System.out.println("Shape : " + clonedShape3.getType());		
   }
}

Adım 5

Çıkışı doğrulayın.

Shape : Circle
Shape : Square
Shape : Rectangle

Bağdaştırıcı modeli, iki uyumsuz arabirim arasında bir köprü görevi görür. Bu model, iki bağımsız arayüzün kapasitesini birleştirdiğinden, bu tür bir tasarım modeli yapısal modele girer.

Bu model, bağımsız veya uyumsuz arayüzlerin işlevlerini birleştirmekten sorumlu olan tek bir sınıfı içerir. Gerçek hayattan bir örnek, hafıza kartı ile bir dizüstü bilgisayar arasında adaptör görevi gören bir kart okuyucu durumu olabilir. Hafıza kartını kart okuyucuya ve kart okuyucuyu dizüstü bilgisayara takarsınız, böylece hafıza kartı dizüstü bilgisayar üzerinden okunabilir.

Bir ses oynatıcı cihazının yalnızca mp3 dosyalarını çalabildiği ve vlc ve mp4 dosyalarını çalabilen gelişmiş bir ses oynatıcı kullanmak istediği aşağıdaki örnekle Adaptör modelinin kullanımını gösteriyoruz.

Uygulama

Biz bir arayüz ettik MediaPlayer arayüzü ve bir beton sınıfı AudioPlayer uygulayan MediaPlayer arayüzü. AudioPlayer , varsayılan olarak mp3 formatındaki ses dosyalarını çalabilir.

Biz başka bir arayüze sahip olduğunuz AdvancedMediaPlayer ve uygulama beton sınıfları AdvancedMediaPlayer vlc ve mp4 formatındaki dosyaları oynatabilirsiniz interface.These sınıfları.

AudioPlayer'ı diğer formatları da oynatmak için yapmak istiyoruz . Bunu elde etmek için , MediaPlayer arayüzünü uygulayan ve gerekli formatı oynatmak için AdvancedMediaPlayer nesnelerini kullanan bir adaptör sınıfı MediaAdapter oluşturduk .

AudioPlayer , MediaAdapter bağdaştırıcı sınıfını kullanarak , istenen biçimi çalabilecek gerçek sınıfı bilmeden istenen ses türünü geçirir . AdapterPatternDemo , demo sınıfımız çeşitli formatları oynatmak için AudioPlayer sınıfını kullanacaktır .

Aşama 1

Media Player ve Advanced Media Player için arayüzler oluşturun.

MediaPlayer.java

public interface MediaPlayer {
   public void play(String audioType, String fileName);
}

AdvancedMediaPlayer.java

public interface AdvancedMediaPlayer {	
   public void playVlc(String fileName);
   public void playMp4(String fileName);
}

Adım 2

AdvancedMediaPlayer arayüzünü uygulayarak somut sınıflar oluşturun .

VlcPlayer.java

public class VlcPlayer implements AdvancedMediaPlayer{
   @Override
   public void playVlc(String fileName) {
      System.out.println("Playing vlc file. Name: "+ fileName);		
   }

   @Override
   public void playMp4(String fileName) {
      //do nothing
   }
}

Mp4Player.java

public class Mp4Player implements AdvancedMediaPlayer{

   @Override
   public void playVlc(String fileName) {
      //do nothing
   }

   @Override
   public void playMp4(String fileName) {
      System.out.println("Playing mp4 file. Name: "+ fileName);		
   }
}

Aşama 3

MediaPlayer arabirimini uygulayarak adaptör sınıfı oluşturun .

MediaAdapter.java

public class MediaAdapter implements MediaPlayer {

   AdvancedMediaPlayer advancedMusicPlayer;

   public MediaAdapter(String audioType){
      if(audioType.equalsIgnoreCase("vlc") ){
         advancedMusicPlayer = new VlcPlayer();			
      } else if (audioType.equalsIgnoreCase("mp4")){
         advancedMusicPlayer = new Mp4Player();
      }	
   }

   @Override
   public void play(String audioType, String fileName) {
      if(audioType.equalsIgnoreCase("vlc")){
         advancedMusicPlayer.playVlc(fileName);
      }else if(audioType.equalsIgnoreCase("mp4")){
         advancedMusicPlayer.playMp4(fileName);
      }
   }
}

4. adım

MediaPlayer arayüzünü uygulayarak somut bir sınıf oluşturun .

AudioPlayer.java

public class AudioPlayer implements MediaPlayer {
   MediaAdapter mediaAdapter; 

   @Override
   public void play(String audioType, String fileName) {		

      //inbuilt support to play mp3 music files
      if(audioType.equalsIgnoreCase("mp3")){
         System.out.println("Playing mp3 file. Name: "+ fileName);			
      } 
      //mediaAdapter is providing support to play other file formats
      else if(audioType.equalsIgnoreCase("vlc") 
         || audioType.equalsIgnoreCase("mp4")){
         mediaAdapter = new MediaAdapter(audioType);
         mediaAdapter.play(audioType, fileName);
      }
      else{
         System.out.println("Invalid media. "+
            audioType + " format not supported");
      }
   }   
}

Adım 5

Farklı ses formatlarını oynatmak için AudioPlayer'ı kullanın.

AdapterPatternDemo.java

public class AdapterPatternDemo {
   public static void main(String[] args) {
      AudioPlayer audioPlayer = new AudioPlayer();

      audioPlayer.play("mp3", "beyond the horizon.mp3");
      audioPlayer.play("mp4", "alone.mp4");
      audioPlayer.play("vlc", "far far away.vlc");
      audioPlayer.play("avi", "mind me.avi");
   }
}

6. Adım

Çıkışı doğrulayın.

Playing mp3 file. Name: beyond the horizon.mp3
Playing mp4 file. Name: alone.mp4
Playing vlc file. Name: far far away.vlc
Invalid media. avi format not supported

Köprü, bir soyutlamayı uygulamasından ayırmamız gerektiğinde kullanılır, böylece ikisi birbirinden bağımsız olarak değişebilir. Bu desen türü, aralarında bir köprü yapısı sağlayarak uygulama sınıfını ve soyut sınıfı ayırdığı için yapısal modelin altına girer.

Bu model, somut sınıfların işlevselliğini arayüz gerçekleyici sınıflarından bağımsız kılan bir köprü görevi gören bir arayüz içerir. Her iki sınıf türü de birbirini etkilemeden yapısal olarak değiştirilebilir.

Aynı soyut sınıf yöntemi, ancak farklı köprü uygulayıcı sınıfları kullanılarak farklı renklerde bir dairenin çizilebildiği aşağıdaki örnekle Bridge deseninin kullanımını gösteriyoruz.

Uygulama

Biz bir arayüz ettik DrawAPI köprü uygulayici ve beton sınıfları olarak davranmaktadır arayüzü RedCircle , GreenCircle uygulayan DrawAPI arayüzü. Shape soyut bir sınıftır ve DrawAPI nesnesini kullanır . BridgePatternDemo , demo sınıfımız farklı renkli daire çizmek için Shape sınıfını kullanacaktır .

Aşama 1

Köprü uygulayıcı arayüzü oluşturun.

DrawAPI.java

public interface DrawAPI {
   public void drawCircle(int radius, int x, int y);
}

Adım 2

DrawAPI arayüzünü uygulayarak somut köprü uygulayıcı sınıfları oluşturun .

RedCircle.java

public class RedCircle implements DrawAPI {
   @Override
   public void drawCircle(int radius, int x, int y) {
      System.out.println("Drawing Circle[ color: red, radius: "
         + radius +", x: " +x+", "+ y +"]");
   }
}

GreenCircle.java

public class GreenCircle implements DrawAPI {
   @Override
   public void drawCircle(int radius, int x, int y) {
      System.out.println("Drawing Circle[ color: green, radius: "
         + radius +", x: " +x+", "+ y +"]");
   }
}

Aşama 3

DrawAPI arabirimini kullanarak soyut bir sınıf Shape oluşturun .

Shape.java

public abstract class Shape {
   protected DrawAPI drawAPI;
   protected Shape(DrawAPI drawAPI){
      this.drawAPI = drawAPI;
   }
   public abstract void draw();	
}

4. adım

Shape arabirimini uygulayarak somut sınıf oluşturun .

Circle.java

public class Circle extends Shape {
   private int x, y, radius;

   public Circle(int x, int y, int radius, DrawAPI drawAPI) {
      super(drawAPI);
      this.x = x;  
      this.y = y;  
      this.radius = radius;
   }

   public void draw() {
      drawAPI.drawCircle(radius,x,y);
   }
}

Adım 5

Farklı renkli daireler çizmek için Shape ve DrawAPI sınıflarını kullanın.

BridgePatternDemo.java

public class BridgePatternDemo {
   public static void main(String[] args) {
      Shape redCircle = new Circle(100,100, 10, new RedCircle());
      Shape greenCircle = new Circle(100,100, 10, new GreenCircle());

      redCircle.draw();
      greenCircle.draw();
   }
}

6. Adım

Çıkışı doğrulayın.

Drawing Circle[ color: red, radius: 10, x: 100, 100]
Drawing Circle[  color: green, radius: 10, x: 100, 100]

Filtre modeli veya Ölçüt kalıbı, geliştiricilerin bir dizi nesneyi farklı ölçütler kullanarak, mantıksal işlemlerle birbirlerinden bağımsız bir şekilde zincirleyerek filtrelemelerini sağlayan bir tasarım modelidir. Bu model, tek bir kriter elde etmek için birden çok kriteri birleştirdiğinden, bu tür bir tasarım modeli yapısal modelin kapsamına girer.

Uygulama

Kişi nesnelerinin listesini filtrelemek için bir Kişi nesnesi, Ölçüt arabirimi ve bu arabirimi uygulayan somut sınıflar oluşturacağız . CriteriaPatternDemo , demo sınıfımız , Kişinin Listesi nesnelerini çeşitli ölçütlere ve bunların kombinasyonlarına göre filtrelemek için Ölçüt nesnelerini kullanır .

Aşama 1

Ölçütlerin uygulanacağı bir sınıf oluşturun.

Person.java

public class Person {
	
   private String name;
   private String gender;
   private String maritalStatus;

   public Person(String name,String gender,String maritalStatus){
      this.name = name;
      this.gender = gender;
      this.maritalStatus = maritalStatus;		
   }

   public String getName() {
      return name;
   }
   public String getGender() {
      return gender;
   }
   public String getMaritalStatus() {
      return maritalStatus;
   }	
}

Adım 2

Ölçütler için bir arayüz oluşturun.

Criteria.java

import java.util.List;

public interface Criteria {
   public List<Person> meetCriteria(List<Person> persons);
}

Aşama 3

Ölçüt arayüzünü uygulayarak somut sınıflar oluşturun .

CriteriaMale.java

import java.util.ArrayList;
import java.util.List;

public class CriteriaMale implements Criteria {

   @Override
   public List<Person> meetCriteria(List<Person> persons) {
      List<Person> malePersons = new ArrayList<Person>(); 
      for (Person person : persons) {
         if(person.getGender().equalsIgnoreCase("MALE")){
            malePersons.add(person);
         }
      }
      return malePersons;
   }
}

CriteriaFemale.java

import java.util.ArrayList;
import java.util.List;

public class CriteriaFemale implements Criteria {

   @Override
   public List<Person> meetCriteria(List<Person> persons) {
      List<Person> femalePersons = new ArrayList<Person>(); 
      for (Person person : persons) {
         if(person.getGender().equalsIgnoreCase("FEMALE")){
            femalePersons.add(person);
         }
      }
      return femalePersons;
   }
}

CriteriaSingle.java

import java.util.ArrayList;
import java.util.List;

public class CriteriaSingle implements Criteria {

   @Override
   public List<Person> meetCriteria(List<Person> persons) {
      List<Person> singlePersons = new ArrayList<Person>(); 
      for (Person person : persons) {
         if(person.getMaritalStatus().equalsIgnoreCase("SINGLE")){
            singlePersons.add(person);
         }
      }
      return singlePersons;
   }
}

AndCriteria.java

import java.util.List;

public class AndCriteria implements Criteria {

   private Criteria criteria;
   private Criteria otherCriteria;

   public AndCriteria(Criteria criteria, Criteria otherCriteria) {
      this.criteria = criteria;
      this.otherCriteria = otherCriteria; 
   }

   @Override
   public List<Person> meetCriteria(List<Person> persons) {
      List<Person> firstCriteriaPersons = criteria.meetCriteria(persons);		
      return otherCriteria.meetCriteria(firstCriteriaPersons);
   }
}

OrCriteria.java

import java.util.List;

public class AndCriteria implements Criteria {

   private Criteria criteria;
   private Criteria otherCriteria;

   public AndCriteria(Criteria criteria, Criteria otherCriteria) {
      this.criteria = criteria;
      this.otherCriteria = otherCriteria; 
   }

   @Override
   public List<Person> meetCriteria(List<Person> persons) {
      List<Person> firstCriteriaItems = criteria.meetCriteria(persons);
      List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons);

      for (Person person : otherCriteriaItems) {
         if(!firstCriteriaItems.contains(person)){
	        firstCriteriaItems.add(person);
         }
      }	
      return firstCriteriaItems;
   }
}

4. adım

Kişileri filtrelemek için farklı Kriterler ve bunların kombinasyonlarını kullanın.

CriteriaPatternDemo.java

import java.util.ArrayList;
import java.util.List;

public class CriteriaPatternDemo {
   public static void main(String[] args) {
      List<Person> persons = new ArrayList<Person>();

      persons.add(new Person("Robert","Male", "Single"));
      persons.add(new Person("John","Male", "Married"));
      persons.add(new Person("Laura","Female", "Married"));
      persons.add(new Person("Diana","Female", "Single"));
      persons.add(new Person("Mike","Male", "Single"));
      persons.add(new Person("Bobby","Male", "Single"));

      Criteria male = new CriteriaMale();
      Criteria female = new CriteriaFemale();
      Criteria single = new CriteriaSingle();
      Criteria singleMale = new AndCriteria(single, male);
      Criteria singleOrFemale = new OrCriteria(single, female);

      System.out.println("Males: ");
      printPersons(male.meetCriteria(persons));

      System.out.println("\nFemales: ");
      printPersons(female.meetCriteria(persons));

      System.out.println("\nSingle Males: ");
      printPersons(singleMale.meetCriteria(persons));

      System.out.println("\nSingle Or Females: ");
      printPersons(singleOrFemale.meetCriteria(persons));
   }

   public static void printPersons(List<Person> persons){
      for (Person person : persons) {
         System.out.println("Person : [ Name : " + person.getName() 
            +", Gender : " + person.getGender() 
            +", Marital Status : " + person.getMaritalStatus()
            +" ]");
      }
   }      
}

Adım 5

Çıkışı doğrulayın.

Males: 
Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
Person : [ Name : John, Gender : Male, Marital Status : Married ]
Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]

Females: 
Person : [ Name : Laura, Gender : Female, Marital Status : Married ]
Person : [ Name : Diana, Gender : Female, Marital Status : Single ]

Single Males: 
Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]

Single Or Females: 
Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
Person : [ Name : Diana, Gender : Female, Marital Status : Single ]
Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]
Person : [ Name : Laura, Gender : Female, Marital Status : Married ]

Bileşik desen, bir grup nesneyi benzer şekilde tek bir nesne olarak ele almamız gerektiğinde kullanılır. Bileşik desen, tüm hiyerarşinin yanı sıra parçayı da temsil etmek için bir ağaç yapısı bağlamında nesneleri oluşturur. Bu desen türü, bu desen bir nesne grubu ağaç yapısı oluşturduğundan yapısal modelin altına girer.

Bu desen, kendi nesnelerinin grubunu içeren bir sınıf oluşturur. Bu sınıf, aynı nesnelerden oluşan grubunu değiştirmenin yollarını sağlar.

Bir kuruluşun çalışan hiyerarşisini gösteren aşağıdaki örnekle Kompozit desen kullanımını gösteriyoruz.

Uygulama

Kompozit model oyuncu sınıfı olarak hareket eden bir sınıf çalışanımız var. Demo sınıfımız CompositePatternDemo , departman düzeyinde hiyerarşi eklemek ve tüm çalışanları yazdırmak için Employee sınıfını kullanacaktır .

Aşama 1

Employee nesnelerinin listesine sahip Çalışan sınıfı oluşturun .

Employee.java

import java.util.ArrayList;
import java.util.List;

public class Employee {
   private String name;
   private String dept;
   private int salary;
   private List<Employee> subordinates;

   // constructor
   public Employee(String name,String dept, int sal) {
      this.name = name;
      this.dept = dept;
      this.salary = sal;
      subordinates = new ArrayList<Employee>();
   }

   public void add(Employee e) {
      subordinates.add(e);
   }

   public void remove(Employee e) {
      subordinates.remove(e);
   }

   public List<Employee> getSubordinates(){
     return subordinates;
   }

   public String toString(){
      return ("Employee :[ Name : "+ name 
      +", dept : "+ dept + ", salary :"
      + salary+" ]");
   }   
}

Adım 2

Çalışan hiyerarşisini oluşturmak ve yazdırmak için Employee sınıfını kullanın .

CompositePatternDemo.java

public class CompositePatternDemo {
   public static void main(String[] args) {
      Employee CEO = new Employee("John","CEO", 30000);

      Employee headSales = new Employee("Robert","Head Sales", 20000);

      Employee headMarketing = new Employee("Michel","Head Marketing", 20000);

      Employee clerk1 = new Employee("Laura","Marketing", 10000);
      Employee clerk2 = new Employee("Bob","Marketing", 10000);

      Employee salesExecutive1 = new Employee("Richard","Sales", 10000);
      Employee salesExecutive2 = new Employee("Rob","Sales", 10000);

      CEO.add(headSales);
      CEO.add(headMarketing);

      headSales.add(salesExecutive1);
      headSales.add(salesExecutive2);

      headMarketing.add(clerk1);
      headMarketing.add(clerk2);

      //print all employees of the organization
      System.out.println(CEO); 
      for (Employee headEmployee : CEO.getSubordinates()) {
         System.out.println(headEmployee);
         for (Employee employee : headEmployee.getSubordinates()) {
            System.out.println(employee);
         }
      }		
   }
}

Aşama 3

Çıkışı doğrulayın.

Employee :[ Name : John, dept : CEO, salary :30000 ]
Employee :[ Name : Robert, dept : Head Sales, salary :20000 ]
Employee :[ Name : Richard, dept : Sales, salary :10000 ]
Employee :[ Name : Rob, dept : Sales, salary :10000 ]
Employee :[ Name : Michel, dept : Head Marketing, salary :20000 ]
Employee :[ Name : Laura, dept : Marketing, salary :10000 ]
Employee :[ Name : Bob, dept : Marketing, salary :10000 ]

Dekoratör deseni, yapısını değiştirmeden mevcut bir nesneye yeni işlevsellik eklemeye izin verir. Bu desen türü, bu desen mevcut sınıf için bir sarmalayıcı görevi gördüğünden yapısal modele girer.

Bu desen, orijinal sınıfı saran ve sınıf yöntemlerinin imzasını olduğu gibi koruyan ek işlevsellik sağlayan bir dekoratör sınıfı oluşturur.

Bir şekli, şekil sınıfını değiştirmeden biraz renkle dekore edeceğimiz aşağıdaki örnekle Dekoratör deseninin kullanımını gösteriyoruz.

Uygulama

Biz oluşturmak için gidiyoruz Şekli arayüzü ve uygulama beton sınıfları Şekli arayüzü. Daha sonra Shape arayüzünü uygulayan ve örnek değişkeni olarak Shape nesnesine sahip olan bir soyut dekoratör sınıfı ShapeDecorator oluşturuyoruz .

RedShapeDecorator , ShapeDecorator uygulayan somut bir sınıftır .

DecoratorPatternDemo , demo sınıfımız Shape nesnelerini süslemek için RedShapeDecorator kullanacaktır .

Aşama 1

Bir arayüz oluşturun.

Shape.java

public interface Shape {
   void draw();
}

Adım 2

Aynı arayüzü uygulayan somut sınıflar oluşturun.

Rectangle.java

public class Rectangle implements Shape {

   @Override
   public void draw() {
      System.out.println("Shape: Rectangle");
   }
}

Circle.java

public class Circle implements Shape {

   @Override
   public void draw() {
      System.out.println("Shape: Circle");
   }
}

Aşama 3

Shape arabirimini uygulayan soyut dekoratör sınıfı oluşturun .

ShapeDecorator.java

public abstract class ShapeDecorator implements Shape {
   protected Shape decoratedShape;

   public ShapeDecorator(Shape decoratedShape){
      this.decoratedShape = decoratedShape;
   }

   public void draw(){
      decoratedShape.draw();
   }	
}

4. adım

ShapeDecorator sınıfını genişleten somut dekoratör sınıfı oluşturun .

RedShapeDecorator.java

public class RedShapeDecorator extends ShapeDecorator {

   public RedShapeDecorator(Shape decoratedShape) {
      super(decoratedShape);		
   }

   @Override
   public void draw() {
      decoratedShape.draw();	       
      setRedBorder(decoratedShape);
   }

   private void setRedBorder(Shape decoratedShape){
      System.out.println("Border Color: Red");
   }
}

Adım 5

Shape nesnelerini süslemek için RedShapeDecorator'u kullanın .

DekoratörPatternDemo.java

public class DecoratorPatternDemo {
   public static void main(String[] args) {

      Shape circle = new Circle();

      Shape redCircle = new RedShapeDecorator(new Circle());

      Shape redRectangle = new RedShapeDecorator(new Rectangle());
      System.out.println("Circle with normal border");
      circle.draw();

      System.out.println("\nCircle of red border");
      redCircle.draw();

      System.out.println("\nRectangle of red border");
      redRectangle.draw();
   }
}

6. Adım

Çıkışı doğrulayın.

Circle with normal border
Shape: Circle

Circle of red border
Shape: Circle
Border Color: Red

Rectangle of red border
Shape: Rectangle
Border Color: Red

Cephe deseni, sistemin karmaşıklığını gizler ve müşteriye, müşterinin sisteme erişebileceği bir arayüz sağlar. Bu desen türü, karmaşıklıklarını gizlemek için sistemden çıkan sisteme bir arayüz eklediği için yapısal modelin altına girer.

Bu model, istemci tarafından ihtiyaç duyulan basitleştirilmiş yöntemler sağlayan ve mevcut sistem sınıfları yöntemlerine çağrıları delege eden tek bir sınıfı içerir.

Uygulama

Biz oluşturmak için gidiyoruz Şekli arayüzü ve uygulama beton sınıfları Şekli arayüzü. Bir cephe sınıfı ShapeMaker , bir sonraki adım olarak tanımlanır.

ShapeMaker sınıfı, bu sınıflara yönelik kullanıcı çağrılarını delege etmek için somut sınıfları kullanır. FacadePatternDemo , demo sınıfımız sonuçları göstermek için ShapeMaker sınıfını kullanacaktır .

Aşama 1

Bir arayüz oluşturun.

Shape.java

public interface Shape {
   void draw();
}

Adım 2

Aynı arayüzü uygulayan somut sınıflar oluşturun.

Rectangle.java

public class Rectangle implements Shape {

   @Override
   public void draw() {
      System.out.println("Rectangle::draw()");
   }
}

Square.java

public class Square implements Shape {

   @Override
   public void draw() {
      System.out.println("Square::draw()");
   }
}

Circle.java

public class Circle implements Shape {

   @Override
   public void draw() {
      System.out.println("Circle::draw()");
   }
}

Aşama 3

Bir cephe sınıfı oluşturun.

ShapeMaker.java

public class ShapeMaker {
   private Shape circle;
   private Shape rectangle;
   private Shape square;

   public ShapeMaker() {
      circle = new Circle();
      rectangle = new Rectangle();
      square = new Square();
   }

   public void drawCircle(){
      circle.draw();
   }
   public void drawRectangle(){
      rectangle.draw();
   }
   public void drawSquare(){
      square.draw();
   }
}

4. adım

Cepheyi çeşitli şekiller çizmek için kullanın.

FacadePatternDemo.java

public class FacadePatternDemo {
   public static void main(String[] args) {
      ShapeMaker shapeMaker = new ShapeMaker();

      shapeMaker.drawCircle();
      shapeMaker.drawRectangle();
      shapeMaker.drawSquare();		
   }
}

Adım 5

Çıkışı doğrulayın.

Circle::draw()
Rectangle::draw()
Square::draw()

Flyweight deseni, öncelikle oluşturulan nesnelerin sayısını azaltmak, bellek ayak izini azaltmak ve performansı artırmak için kullanılır. Bu desen türü, yapısal modelin kapsamına girer, çünkü bu desen nesnelerin sayısını azaltmanın yollarını sağlar ve böylece uygulama gerektiren nesne yapısını iyileştirir.

Flyweight deseni, mevcut benzer türdeki nesneleri depolayarak yeniden kullanmaya çalışır ve eşleşen nesne bulunmadığında yeni nesne oluşturur. Bu deseni farklı konumlardan 20 daire çizerek göstereceğiz, ancak sadece 5 nesne oluşturacağız. Yalnızca 5 renk mevcuttur, bu nedenle mevcut Circle nesnelerini kontrol etmek için color özelliği kullanılır .

Uygulama

Biz oluşturmak için gidiyoruz Şekli arayüzü ve beton sınıfı Çember uygulayan Şekli arayüzü. Bir fabrika sınıfı ShapeFactory , sonraki adım olarak tanımlanır.

ShapeFactory , Circle nesnesinin rengi olarak anahtarı olan bir HashMap of Circle'a sahiptir . ShapeFactory'ye belirli renkte bir daire oluşturmak için bir istek geldiğinde . ShapeFactory kontroller onun içinde çember nesne HashMap amacı ise, Çemberin bulundu, bu nesne aksi döndürülür yeni nesne ileride kullanılmak üzere HashMap saklanır ve müşteriye iade oluşturulur.

FlyWeightPatternDemo , demo sınıfımız bir Shape nesnesi almak için ShapeFactory kullanacaktır . ShapeFactory'ye bilgi ( kırmızı / yeşil / mavi / siyah / beyaz ) aktararak ihtiyaç duyduğu renkteki çemberi alacaktır .

Aşama 1

Bir arayüz oluşturun.

Shape.java

public interface Shape {
   void draw();
}

Adım 2

Aynı arayüzü uygulayarak somut sınıf oluşturun.

Circle.java

public class Circle implements Shape {
   private String color;
   private int x;
   private int y;
   private int radius;

   public Circle(String color){
      this.color = color;		
   }

   public void setX(int x) {
      this.x = x;
   }

   public void setY(int y) {
      this.y = y;
   }

   public void setRadius(int radius) {
      this.radius = radius;
   }

   @Override
   public void draw() {
      System.out.println("Circle: Draw() [Color : " + color 
         +", x : " + x +", y :" + y +", radius :" + radius);
   }
}

Aşama 3

Verilen bilgilere dayanarak somut sınıf nesnesi oluşturmak için bir Fabrika oluşturun.

ShapeFactory.java

import java.util.HashMap;

public class ShapeFactory {

   // Uncomment the compiler directive line and
   // javac *.java will compile properly.
   // @SuppressWarnings("unchecked")
   private static final HashMap circleMap = new HashMap();

   public static Shape getCircle(String color) {
      Circle circle = (Circle)circleMap.get(color);

      if(circle == null) {
         circle = new Circle(color);
         circleMap.put(color, circle);
         System.out.println("Creating circle of color : " + color);
      }
      return circle;
   }
}

4. adım

Renk gibi bir bilgiyi ileterek somut sınıfın nesnesini elde etmek için Fabrikayı kullanın.

FlyweightPatternDemo.java

public class FlyweightPatternDemo {
   private static final String colors[] = 
      { "Red", "Green", "Blue", "White", "Black" };
   public static void main(String[] args) {

      for(int i=0; i < 20; ++i) {
         Circle circle = 
            (Circle)ShapeFactory.getCircle(getRandomColor());
         circle.setX(getRandomX());
         circle.setY(getRandomY());
         circle.setRadius(100);
         circle.draw();
      }
   }
   private static String getRandomColor() {
      return colors[(int)(Math.random()*colors.length)];
   }
   private static int getRandomX() {
      return (int)(Math.random()*100 );
   }
   private static int getRandomY() {
      return (int)(Math.random()*100);
   }
}

Adım 5

Çıkışı doğrulayın.

Creating circle of color : Black
Circle: Draw() [Color : Black, x : 36, y :71, radius :100
Creating circle of color : Green
Circle: Draw() [Color : Green, x : 27, y :27, radius :100
Creating circle of color : White
Circle: Draw() [Color : White, x : 64, y :10, radius :100
Creating circle of color : Red
Circle: Draw() [Color : Red, x : 15, y :44, radius :100
Circle: Draw() [Color : Green, x : 19, y :10, radius :100
Circle: Draw() [Color : Green, x : 94, y :32, radius :100
Circle: Draw() [Color : White, x : 69, y :98, radius :100
Creating circle of color : Blue
Circle: Draw() [Color : Blue, x : 13, y :4, radius :100
Circle: Draw() [Color : Green, x : 21, y :21, radius :100
Circle: Draw() [Color : Blue, x : 55, y :86, radius :100
Circle: Draw() [Color : White, x : 90, y :70, radius :100
Circle: Draw() [Color : Green, x : 78, y :3, radius :100
Circle: Draw() [Color : Green, x : 64, y :89, radius :100
Circle: Draw() [Color : Blue, x : 3, y :91, radius :100
Circle: Draw() [Color : Blue, x : 62, y :82, radius :100
Circle: Draw() [Color : Green, x : 97, y :61, radius :100
Circle: Draw() [Color : Green, x : 86, y :12, radius :100
Circle: Draw() [Color : Green, x : 38, y :93, radius :100
Circle: Draw() [Color : Red, x : 76, y :82, radius :100
Circle: Draw() [Color : Blue, x : 95, y :82, radius :100

Proxy modelinde, bir sınıf başka bir sınıfın işlevselliğini temsil eder. Bu tür bir tasarım deseni yapısal modelin altında gelir.

Proxy modelinde, işlevselliğini dış dünya ile arayüzlemek için orijinal nesneye sahip bir nesne oluştururuz.

Uygulama

Biz oluşturmak için gidiyoruz Görüntü arayüzü ve uygulama beton sınıfları Görüntü arabirimi. ProxyImage , RealImage nesne yüklemesinin bellek ayak izini azaltmak için bir proxy sınıfıdır .

ProxyPatternDemo , demo sınıfımız gerektiğinde yüklemek ve görüntülemek üzere bir Image nesnesi almak için ProxyImage kullanacaktır .

Aşama 1

Bir arayüz oluşturun.

Image.java

public interface Image {
   void display();
}

Adım 2

Aynı arayüzü uygulayan somut sınıflar oluşturun.

RealImage.java

public class RealImage implements Image {

   private String fileName;

   public RealImage(String fileName){
      this.fileName = fileName;
      loadFromDisk(fileName);
   }

   @Override
   public void display() {
      System.out.println("Displaying " + fileName);
   }

   private void loadFromDisk(String fileName){
      System.out.println("Loading " + fileName);
   }
}

ProxyImage.java

public class ProxyImage implements Image{

   private RealImage realImage;
   private String fileName;

   public ProxyImage(String fileName){
      this.fileName = fileName;
   }

   @Override
   public void display() {
      if(realImage == null){
         realImage = new RealImage(fileName);
      }
      realImage.display();
   }
}

Aşama 3

Gerektiğinde RealImage sınıfının nesnesini almak için ProxyImage'ı kullanın .

ProxyPatternDemo.java

public class ProxyPatternDemo {
	
   public static void main(String[] args) {
      Image image = new ProxyImage("test_10mb.jpg");

      //image will be loaded from disk
      image.display(); 
      System.out.println("");
      //image will not be loaded from disk
      image.display(); 	
   }
}

4. adım

Çıkışı doğrulayın.

Loading test_10mb.jpg
Displaying test_10mb.jpg

Displaying test_10mb.jpg

Adından da anlaşılacağı gibi, sorumluluk zinciri modeli bir istek için bir alıcı nesneler zinciri oluşturur. Bu model, talebin tipine bağlı olarak bir talebin göndericisini ve alıcısını ayırır. Bu örüntü, davranış kalıplarının altında gelir.

Bu modelde, normalde her alıcı başka bir alıcıya referans içerir. Bir nesne talebi karşılayamazsa, aynı şeyi bir sonraki alıcıya iletir ve bu böyle devam eder.

Uygulama

Biz soyut sınıf oluşturduk AbstractLogger girişi sureti seviyede. Ardından, AbstractLogger'ı genişleten üç tür kaydedici oluşturduk . Her kaydedici, mesaj seviyesini kendi seviyesine kadar kontrol eder ve buna göre yazdırır, aksi takdirde mesajı yazdırmaz ve sonraki kaydediciye iletmez.

Aşama 1

Soyut bir günlükçü sınıfı oluşturun.

AbstractLogger.java

public abstract class AbstractLogger {
   public static int INFO = 1;
   public static int DEBUG = 2;
   public static int ERROR = 3;

   protected int level;

   //next element in chain or responsibility
   protected AbstractLogger nextLogger;

   public void setNextLogger(AbstractLogger nextLogger){
      this.nextLogger = nextLogger;
   }

   public void logMessage(int level, String message){
      if(this.level <= level){
         write(message);
      }
      if(nextLogger !=null){
         nextLogger.logMessage(level, message);
      }
   }

   abstract protected void write(String message);
	
}

Adım 2

Kaydediciyi genişleten somut sınıflar oluşturun.

ConsoleLogger.java

public class ConsoleLogger extends AbstractLogger {

   public ConsoleLogger(int level){
      this.level = level;
   }

   @Override
   protected void write(String message) {		
      System.out.println("Standard Console::Logger: " + message);
   }
}

ErrorLogger.java

public class ErrorLogger extends AbstractLogger {

   public ErrorLogger(int level){
      this.level = level;
   }

   @Override
   protected void write(String message) {		
      System.out.println("Error Console::Logger: " + message);
   }
}

FileLogger.java

public class FileLogger extends AbstractLogger {

   public FileLogger(int level){
      this.level = level;
   }

   @Override
   protected void write(String message) {		
      System.out.println("File::Logger: " + message);
   }
}

Aşama 3

Farklı tipte kaydediciler oluşturun. Onlara hata seviyeleri atayın ve her kaydediciye sonraki kaydediciyi ayarlayın. Her kaydedicideki sonraki kaydedici, zincirin parçasını temsil eder.

ChainPatternDemo.java

public class ChainPatternDemo {
	
   private static AbstractLogger getChainOfLoggers(){

      AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
      AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
      AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);

      errorLogger.setNextLogger(fileLogger);
      fileLogger.setNextLogger(consoleLogger);

      return errorLogger;	
   }

   public static void main(String[] args) {
      AbstractLogger loggerChain = getChainOfLoggers();

      loggerChain.logMessage(AbstractLogger.INFO, 
         "This is an information.");

      loggerChain.logMessage(AbstractLogger.DEBUG, 
         "This is an debug level information.");

      loggerChain.logMessage(AbstractLogger.ERROR, 
         "This is an error information.");
   }
}

4. adım

Çıkışı doğrulayın.

Standard Console::Logger: This is an information.
File::Logger: This is an debug level information.
Standard Console::Logger: This is an debug level information.
Error Console::Logger: This is an error information.
File::Logger: This is an error information.
Standard Console::Logger: This is an error information.

Komut kalıbı, veriye dayalı bir tasarım kalıbıdır ve davranış kalıbı kategorisine girer. Bir istek, bir nesnenin altına komut olarak sarılır ve invoker nesnesine iletilir. Invoker nesnesi, bu komutu işleyebilen ve komutu karşılık gelen nesneye iletebilen uygun nesneyi arar ve bu nesne komutu yürütür.

Uygulama

Komut olarak hareket eden bir arayüz düzeni oluşturduk . Talep olarak hareket eden bir Stok sınıfı oluşturduk . Gerçek komut işlemeyi gerçekleştirecek Sipariş arayüzünü uygulayan BuyStock ve SellStock somut komut sınıflarımız var . Çağırıcı nesne olarak hareket eden bir sınıf Broker oluşturulur. Sipariş alabilir ve sipariş verebilir.

Broker nesnesi, komut türüne bağlı olarak hangi nesnenin hangi komutu yürüteceğini belirlemek için komut desenini kullanır. CommandPatternDemo , demo sınıfımız komut modelini göstermek için Broker sınıfını kullanacaktır .

Aşama 1

Bir komut arayüzü oluşturun.

Order.java

public interface Order {
   void execute();
}

Adım 2

Bir istek sınıfı oluşturun.

Stock.java

public class Stock {
	
   private String name = "ABC";
   private int quantity = 10;

   public void buy(){
      System.out.println("Stock [ Name: "+name+", 
         Quantity: " + quantity +" ] bought");
   }
   public void sell(){
      System.out.println("Stock [ Name: "+name+", 
         Quantity: " + quantity +" ] sold");
   }
}

Aşama 3

Sipariş arayüzünü uygulayarak somut sınıflar oluşturun .

BuyStock.java

public class BuyStock implements Order {
   private Stock abcStock;

   public BuyStock(Stock abcStock){
      this.abcStock = abcStock;
   }

   public void execute() {
      abcStock.buy();
   }
}

SellStock.java

public class SellStock implements Order {
   private Stock abcStock;

   public SellStock(Stock abcStock){
      this.abcStock = abcStock;
   }

   public void execute() {
      abcStock.sell();
   }
}

4. adım

Komut çağırıcı sınıfı oluşturun.

Broker.java

import java.util.ArrayList;
import java.util.List;

   public class Broker {
   private List<Order> orderList = new ArrayList<Order>(); 

   public void takeOrder(Order order){
      orderList.add(order);		
   }

   public void placeOrders(){
      for (Order order : orderList) {
         order.execute();
      }
      orderList.clear();
   }
}

Adım 5

Komutları almak ve yürütmek için Broker sınıfını kullanın.

CommandPatternDemo.java

public class CommandPatternDemo {
   public static void main(String[] args) {
      Stock abcStock = new Stock();

      BuyStock buyStockOrder = new BuyStock(abcStock);
      SellStock sellStockOrder = new SellStock(abcStock);

      Broker broker = new Broker();
      broker.takeOrder(buyStockOrder);
      broker.takeOrder(sellStockOrder);

      broker.placeOrders();
   }
}

6. Adım

Çıkışı doğrulayın.

Stock [ Name: ABC, Quantity: 10 ] bought
Stock [ Name: ABC, Quantity: 10 ] sold

Tercüman kalıbı, dil grameri veya ifadesini değerlendirmek için bir yol sağlar. Bu tür bir kalıp, davranış kalıplarının altında gelir. Bu model, belirli bir bağlamı yorumlamayı söyleyen bir ifade arayüzünün uygulanmasını içerir. Bu desen SQL ayrıştırma, sembol işleme motorunda vb. Kullanılır.

Uygulama

Biz bir arayüz oluşturmak için gidiyoruz Expression ve uygulama beton sınıfları İfade arayüzü. Söz konusu bağlamın ana yorumlayıcısı olarak görev yapan bir sınıf TerminalExpression tanımlanır. Diğer sınıflar OrExpression , AndExpression , kombinasyonel ifadeler oluşturmak için kullanılır.

InterpreterPatternDemo , demo sınıfımız, kurallar oluşturmak ve ifadelerin ayrıştırılmasını göstermek için Expression sınıfını kullanacaktır .

Aşama 1

Bir ifade arayüzü oluşturun.

Expression.java

public interface Expression {
   public boolean interpret(String context);
}

Adım 2

Yukarıdaki arayüzü uygulayarak somut sınıflar oluşturun.

TerminalExpression.java

public class TerminalExpression implements Expression {
	
   private String data;

   public TerminalExpression(String data){
      this.data = data; 
   }

   @Override
   public boolean interpret(String context) {
      if(context.contains(data)){
         return true;
      }
      return false;
   }
}

OrExpression.java

public class OrExpression implements Expression {
	 
   private Expression expr1 = null;
   private Expression expr2 = null;

   public OrExpression(Expression expr1, Expression expr2) { 
      this.expr1 = expr1;
      this.expr2 = expr2;
   }

   @Override
   public boolean interpret(String context) {		
      return expr1.interpret(context) || expr2.interpret(context);
   }
}

AndExpression.java

public class AndExpression implements Expression {
	 
   private Expression expr1 = null;
   private Expression expr2 = null;

   public AndExpression(Expression expr1, Expression expr2) { 
      this.expr1 = expr1;
      this.expr2 = expr2;
   }

   @Override
   public boolean interpret(String context) {		
      return expr1.interpret(context) && expr2.interpret(context);
   }
}

Aşama 3

InterpreterPatternDemo , kurallar oluşturmak ve sonra bunları ayrıştırmak için Expression sınıfını kullanır .

InterpreterPatternDemo.java

public class InterpreterPatternDemo {

   //Rule: Robert and John are male
   public static Expression getMaleExpression(){
      Expression robert = new TerminalExpression("Robert");
      Expression john = new TerminalExpression("John");
      return new OrExpression(robert, john);		
   }

   //Rule: Julie is a married women
   public static Expression getMarriedWomanExpression(){
      Expression julie = new TerminalExpression("Julie");
      Expression married = new TerminalExpression("Married");
      return new AndExpression(julie, married);		
   }

   public static void main(String[] args) {
      Expression isMale = getMaleExpression();
      Expression isMarriedWoman = getMarriedWomanExpression();

      System.out.println("John is male? " + isMale.interpret("John"));
      System.out.println("Julie is a married women? " 
      + isMarriedWoman.interpret("Married Julie"));
   }
}

4. adım

Çıkışı doğrulayın.

John is male? true
Julie is a married women? true

Yineleyici modeli, Java ve .Net programlama ortamında çok yaygın olarak kullanılan tasarım modelidir. Bu model, bir koleksiyon nesnesinin öğelerine, temeldeki temsilini bilmeye gerek kalmadan sıralı bir şekilde erişmenin bir yolunu elde etmek için kullanılır.

Yineleyici örüntü, davranış kalıbı kategorisine girer.

Uygulama

Gezinme yöntemini anlatan bir Yineleyici arabirimi ve yineleyiciyi yeniden çalıştıran bir Kapsayıcı arabirimi oluşturacağız. Konteyner arayüzünü uygulayan somut sınıflar, Yineleyici arayüzünü uygulamaktan ve kullanmaktan sorumlu olacaktır.

Demo sınıfımız olan IteratorPatternDemo , NamesRepository'de bir koleksiyon olarak depolanan bir İsimleri yazdırmak için somut bir sınıf uygulaması olan NamesRepository'yi kullanacaktır .

Aşama 1

Arayüzler oluşturun.

Iterator.java

public interface Iterator {
   public boolean hasNext();
   public Object next();
}

Container.java

public interface Container {
   public Iterator getIterator();
}

Adım 2

Kapsayıcı arabirimini uygulayarak somut sınıf oluşturun . Bu sınıf, Yineleyici arabirimini uygulayan iç sınıf NameIterator'a sahiptir .

NameRepository.java

public class NameRepository implements Container {
   public String names[] = {"Robert" , "John" ,"Julie" , "Lora"};

   @Override
   public Iterator getIterator() {
      return new NameIterator();
   }

   private class NameIterator implements Iterator {

      int index;

      @Override
      public boolean hasNext() {
         if(index < names.length){
            return true;
         }
         return false;
      }

      @Override
      public Object next() {
         if(this.hasNext()){
            return names[index++];
         }
         return null;
      }		
   }
}

Aşama 3

Yineleyici almak ve adları yazdırmak için Ad Deposunu kullanın .

IteratorPatternDemo.java

public class IteratorPatternDemo {
	
   public static void main(String[] args) {
      NameRepository namesRepository = new NameRepository();

      for(Iterator iter = namesRepository.getIterator(); iter.hasNext();){
         String name = (String)iter.next();
         System.out.println("Name : " + name);
      } 	
   }
}

4. adım

Çıkışı doğrulayın.

Name : Robert
Name : John
Name : Julie
Name : Lora

Arabulucu örüntü, birden çok nesne veya sınıf arasındaki iletişim karmaşıklığını azaltmak için kullanılır. Bu model, normalde farklı sınıflar arasındaki tüm iletişimleri idare eden ve gevşek bağlantı ile kodun kolay bakımını destekleyen bir aracı sınıfı sağlar. Arabulucu örüntü, davranış kalıbı kategorisine girer.

Uygulama

Arabulucu modelini, birden çok kullanıcının Sohbet Odasına mesaj gönderebileceği bir Sohbet Odası örneğiyle gösteriyoruz ve mesajları tüm kullanıcılara göstermek Sohbet Odasının sorumluluğundadır. ChatRoom ve User olmak üzere iki sınıf oluşturduk . Kullanıcı nesneleri, mesajlarını paylaşmak için ChatRoom yöntemini kullanacaktır .

MediatorPatternDemo , demo sınıfımız aralarındaki iletişimi göstermek için Kullanıcı nesnelerini kullanacaktır .

Aşama 1

Arabulucu sınıfı oluşturun.

ChatRoom.java

import java.util.Date;

public class ChatRoom {
   public static void showMessage(User user, String message){
      System.out.println(new Date().toString()
         + " [" + user.getName() +"] : " + message);
   }
}

Adım 2

Kullanıcı sınıfı oluştur

User.java

public class User {
   private String name;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public User(String name){
      this.name  = name;
   }

   public void sendMessage(String message){
      ChatRoom.showMessage(this,message);
   }
}

Aşama 3

Aralarındaki iletişimi göstermek için Kullanıcı nesnesini kullanın .

MediatorPatternDemo.java

public class MediatorPatternDemo {
   public static void main(String[] args) {
      User robert = new User("Robert");
      User john = new User("John");

      robert.sendMessage("Hi! John!");
      john.sendMessage("Hello! Robert!");
   }
}

4. adım

Çıkışı doğrulayın.

Thu Jan 31 16:05:46 IST 2013 [Robert] : Hi! John!
Thu Jan 31 16:05:46 IST 2013 [John] : Hello! Robert!

Memento kalıbı, bir nesnenin durumunu önceki durumuna geri yüklemek istediğimiz yeri azaltmak için kullanılır. Memento kalıbı davranışsal kalıp kategorisine girer.

Uygulama

Memento modeli üç aktör sınıfı kullanır. Memento, geri yüklenecek bir nesnenin durumunu içerir. Originator, Memento nesnelerinin ve Memento'dan nesne durumunu geri yüklemekten sorumlu olan Caretaker nesnesinde durumları oluşturur ve depolar. Memento , Originator ve CareTaker sınıfları oluşturduk .

MementoPatternDemo , demo sınıfımız , nesne durumlarının geri yüklenmesini göstermek için CareTaker ve Originator nesnelerini kullanacaktır.

Aşama 1

Memento sınıfı oluşturun.

Memento.java

public class Memento {
   private String state;

   public Memento(String state){
      this.state = state;
   }

   public String getState(){
      return state;
   }	
}

Adım 2

Originator sınıfı oluştur

Originator.java

public class Originator {
   private String state;

   public void setState(String state){
      this.state = state;
   }

   public String getState(){
      return state;
   }

   public Memento saveStateToMemento(){
      return new Memento(state);
   }

   public void getStateFromMemento(Memento Memento){
      state = memento.getState();
   }
}

Aşama 3

CareTaker sınıfı oluştur

CareTaker.java

import java.util.ArrayList;
import java.util.List;

public class CareTaker {
   private List<Memento> mementoList = new ArrayList<Memento>();

   public void add(Memento state){
      mementoList.add(state);
   }

   public Memento get(int index){
      return mementoList.get(index);
   }
}

4. adım

CareTaker ve Originator nesnelerini kullanın .

MementoPatternDemo.java

public class MementoPatternDemo {
   public static void main(String[] args) {
      Originator originator = new Originator();
      CareTaker careTaker = new CareTaker();
      originator.setState("State #1");
      originator.setState("State #2");
      careTaker.add(originator.saveStateToMemento());
      originator.setState("State #3");
      careTaker.add(originator.saveStateToMemento());
      originator.setState("State #4");

      System.out.println("Current State: " + originator.getState());		
      originator.getStateFromMemento(careTaker.get(0));
      System.out.println("First saved State: " + originator.getState());
      originator.getStateFromMemento(careTaker.get(1));
      System.out.println("Second saved State: " + originator.getState());
   }
}

Adım 5

Çıkışı doğrulayın.

Current State: State #4
First saved State: State #2
Second saved State: State #3

Gözlemci deseni, nesneler arasında birden çok ilişki olduğunda kullanılır, örneğin bir nesne değiştirilirse, bağımlı nesneler otomatik olarak bildirilir. Gözlemci örüntüsü, davranış kalıbı kategorisine girer.

Uygulama

Gözlemci kalıbı üç oyuncu sınıfı kullanır. Konu, Gözlemci ve Müşteri. Özne, gözlemcileri bir istemci nesnesine eklemek ve bu nesnenin bağlantısını kesmek için yöntemlere sahip bir nesne. Biz sınıflar oluşturduk Konu , Gözlemci soyut sınıf ve soyut sınıf uzanan beton sınıfları Gözlemci .

ObserverPatternDemo , demo sınıfımız gözlemci modelini eylem halinde göstermek için Subject ve somut sınıf nesnelerini kullanacaktır.

Aşama 1

Konu sınıfı oluşturun.

Subject.java

import java.util.ArrayList;
import java.util.List;

public class Subject {
	
   private List<Observer> observers 
      = new ArrayList<Observer>();
   private int state;

   public int getState() {
      return state;
   }

   public void setState(int state) {
      this.state = state;
      notifyAllObservers();
   }

   public void attach(Observer observer){
      observers.add(observer);		
   }

   public void notifyAllObservers(){
      for (Observer observer : observers) {
         observer.update();
      }
   } 	
}

Adım 2

Observer sınıfı oluşturun.

Observer.java

public abstract class Observer {
   protected Subject subject;
   public abstract void update();
}

Aşama 3

Somut gözlemci sınıfları oluşturun

BinaryObserver.java

public class BinaryObserver extends Observer{

   public BinaryObserver(Subject subject){
      this.subject = subject;
      this.subject.attach(this);
   }

   @Override
   public void update() {
      System.out.println( "Binary String: " 
      + Integer.toBinaryString( subject.getState() ) ); 
   }
}

OctalObserver.java

public class OctalObserver extends Observer{

   public OctalObserver(Subject subject){
      this.subject = subject;
      this.subject.attach(this);
   }

   @Override
   public void update() {
     System.out.println( "Octal String: " 
     + Integer.toOctalString( subject.getState() ) ); 
   }
}

HexaObserver.java

public class HexaObserver extends Observer{

   public HexaObserver(Subject subject){
      this.subject = subject;
      this.subject.attach(this);
   }

   @Override
   public void update() {
      System.out.println( "Hex String: " 
      + Integer.toHexString( subject.getState() ).toUpperCase() ); 
   }
}

4. adım

Özne ve somut gözlemci nesneler kullanın .

ObserverPatternDemo.java

public class ObserverPatternDemo {
   public static void main(String[] args) {
      Subject subject = new Subject();

      new HexaObserver(subject);
      new OctalObserver(subject);
      new BinaryObserver(subject);

      System.out.println("First state change: 15");	
      subject.setState(15);
      System.out.println("Second state change: 10");	
      subject.setState(10);
   }
}

Adım 5

Çıkışı doğrulayın.

First state change: 15
Hex String: F
Octal String: 17
Binary String: 1111
Second state change: 10
Hex String: A
Octal String: 12
Binary String: 1010

Durum modelinde bir sınıf davranışı, durumuna bağlı olarak değişir. Bu tür bir tasarım örüntüsü davranış örüntüsünün kapsamına girer.

Durum modelinde, çeşitli durumları temsil eden nesneler ve durum nesnesi değiştikçe davranışı değişen bir bağlam nesnesi yaratırız.

Uygulama

Biz oluşturmak için gidiyoruz Devleti bir eylemi ve uygulama beton devlet sınıflarını tanımlama arabirimi Devlet arayüzü. Bağlam , bir Durum taşıyan bir sınıftır.

StaePatternDemo , demo sınıfımız, içinde bulunduğu durumun türüne bağlı olarak Bağlam davranışındaki değişikliği göstermek için Bağlam ve durum nesnelerini kullanacaktır.

Aşama 1

Bir arayüz oluşturun.

Image.java

public interface State {
   public void doAction(Context context);
}

Adım 2

Aynı arayüzü uygulayan somut sınıflar oluşturun.

StartState.java

public class StartState implements State {

   public void doAction(Context context) {
      System.out.println("Player is in start state");
      context.setState(this);	
   }

   public String toString(){
      return "Start State";
   }
}

StopState.java

public class StopState implements State {

   public void doAction(Context context) {
      System.out.println("Player is in stop state");
      context.setState(this);	
   }

   public String toString(){
      return "Stop State";
   }
}

Aşama 3

Bağlam Sınıfı oluşturun .

Context.java

public class Context {
   private State state;

   public Context(){
      state = null;
   }

   public void setState(State state){
      this.state = state;		
   }

   public State getState(){
      return state;
   }
}

4. adım

Durum değiştiğinde davranıştaki değişikliği görmek için Bağlamı kullanın .

StatePatternDemo.java

public class StatePatternDemo {
   public static void main(String[] args) {
      Context context = new Context();

      StartState startState = new StartState();
      startState.doAction(context);

      System.out.println(context.getState().toString());

      StopState stopState = new StopState();
      stopState.doAction(context);

      System.out.println(context.getState().toString());
   }
}

Adım 5

Çıkışı doğrulayın.

Player is in start state
Start State
Player is in stop state
Stop State

Boş Nesne deseninde, boş bir nesne, NULL nesne örneğinin kontrolünün yerini alır. İf check for a null değeri koymak yerine, Null Object bir hiçbir şey yapmama ilişkisini yansıtır. Bu tür Null nesnesi, verilerin mevcut olmaması durumunda varsayılan davranış sağlamak için de kullanılabilir.

Null Object modelinde, yapılacak çeşitli işlemleri belirleyen soyut bir sınıf oluşturuyoruz, bu sınıfı genişleten somut sınıflar ve bu sınıfın hiçbir şey yapmamasını sağlayan bir boş nesne sınıfı ve boş değeri kontrol etmemiz gereken yerde görünüşsüz olarak kullanılacak.

Uygulama

Opearations'ı tanımlayan bir AbstractCustomer soyut sınıfı oluşturacağız, burada müşterinin adı ve AbstractCustomer sınıfını genişleten somut sınıflar . Bir fabrika sınıfı CustomerFactory , kendisine iletilen müşteri adına göre RealCustomer veya NullCustomer nesnelerini döndürmek için oluşturulur .

NullPatternDemo , demo sınıfımız Null Nesne modelinin kullanımını göstermek için CustomerFactory'yi kullanacaktır.

Aşama 1

Soyut bir sınıf oluşturun.

AbstractCustomer.java

public abstract class AbstractCustomer {
   protected String name;
   public abstract boolean isNil();
   public abstract String getName();
}

Adım 2

Yukarıdaki sınıfı genişleten somut sınıflar oluşturun.

RealCustomer.java

public class RealCustomer extends AbstractCustomer {

   public RealCustomer(String name) {
      this.name = name;		
   }
   
   @Override
   public String getName() {
      return name;
   }
   
   @Override
   public boolean isNil() {
      return false;
   }
}

NullCustomer.java

public class NullCustomer extends AbstractCustomer {

   @Override
   public String getName() {
      return "Not Available in Customer Database";
   }

   @Override
   public boolean isNil() {
      return true;
   }
}

Aşama 3

CustomerFactory Sınıfı oluşturun .

CustomerFactory.java

public class CustomerFactory {
	
   public static final String[] names = {"Rob", "Joe", "Julie"};

   public static AbstractCustomer getCustomer(String name){
      for (int i = 0; i < names.length; i++) {
         if (names[i].equalsIgnoreCase(name)){
            return new RealCustomer(name);
         }
      }
      return new NullCustomer();
   }
}

4. adım

Kullanım CustomerFactory ya olsun RealCustomer veya NullCustomer kendisine geçirilen müşteri adına göre nesnelerin.

NullPatternDemo.java

public class NullPatternDemo {
   public static void main(String[] args) {

      AbstractCustomer customer1 = CustomerFactory.getCustomer("Rob");
      AbstractCustomer customer2 = CustomerFactory.getCustomer("Bob");
      AbstractCustomer customer3 = CustomerFactory.getCustomer("Julie");
      AbstractCustomer customer4 = CustomerFactory.getCustomer("Laura");

      System.out.println("Customers");
      System.out.println(customer1.getName());
      System.out.println(customer2.getName());
      System.out.println(customer3.getName());
      System.out.println(customer4.getName());
   }
}

Adım 5

Çıkışı doğrulayın.

Customers
Rob
Not Available in Customer Database
Julie
Not Available in Customer Database

Strateji modelinde, bir sınıf davranışı veya algoritması çalışma zamanında değiştirilebilir. Bu tür bir tasarım örüntüsü davranış örüntüsünün kapsamına girer.

Strateji modelinde, çeşitli stratejileri temsil eden nesneler ve davranışı strateji nesnesine göre değişen bir bağlam nesnesi yaratırız. Strateji nesnesi, bağlam nesnesinin yürütme algoritmasını değiştirir.

Uygulama

Biz oluşturmak için gidiyoruz Strateji bir eylem ve uygulama beton strateji sınıfları tanımlayan bir arayüz Strateji arayüzünü. Bağlam , bir Strateji kullanan bir sınıftır.

StrategyPatternDemo , demo sınıfımız, uyguladığı veya kullandığı stratejiye dayalı Bağlam davranışındaki değişikliği göstermek için Bağlam ve strateji nesnelerini kullanacaktır.

Aşama 1

Bir arayüz oluşturun.

Strategy.java

public interface Strategy {
   public int doOperation(int num1, int num2);
}

Adım 2

Aynı arayüzü uygulayan somut sınıflar oluşturun.

OperationAdd.java

public class OperationAdd implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 + num2;
   }
}

OperationSubstract.java

public class OperationSubstract implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 - num2;
   }
}

OperationMultiply.java

public class OperationMultiply implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 * num2;
   }
}

Aşama 3

Bağlam Sınıfı oluşturun .

Context.java

public class Context {
   private Strategy strategy;

   public Context(Strategy strategy){
      this.strategy = strategy;
   }

   public int executeStrategy(int num1, int num2){
      return strategy.doOperation(num1, num2);
   }
}

4. adım

Stratejisini değiştirdiğinde davranıştaki değişikliği görmek için Bağlamı kullanın .

StatePatternDemo.java

public class StrategyPatternDemo {
   public static void main(String[] args) {
      Context context = new Context(new OperationAdd());		
      System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

      context = new Context(new OperationSubstract());		
      System.out.println("10 - 5 = " + context.executeStrategy(10, 5));

      context = new Context(new OperationMultiply());		
      System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
   }
}

Adım 5

Çıkışı doğrulayın.

10 + 5 = 15
10 - 5 = 5
10 * 5 = 50

Şablon modelinde, soyut bir sınıf, yöntemlerini yürütmek için tanımlanmış yolları / şablonları ortaya çıkarır. Alt sınıfları, ihtiyaca göre yöntem uygulamalarını geçersiz kılabilir, ancak çağrı, soyut bir sınıf tarafından tanımlananla aynı şekilde olacaktır. Bu örüntü, davranış örüntüleri kategorisine girer.

Uygulama

Geçersiz kılınamayacak şekilde nihai olacak şekilde ayarlanmış bir şablon yöntemi ile işlemleri tanımlayan bir Oyun soyut sınıfı oluşturacağız . Kriket ve Futbol , Oyunu genişleten ve yöntemlerini geçersiz kılan somut sınıflardır .

TemplatePatternDemo , demo sınıfımız , şablon modelinin kullanımını göstermek için Game'i kullanacaktır.

Aşama 1

Nihai bir şablon yöntemiyle soyut bir sınıf oluşturun.

Game.java

public abstract class Game {
   abstract void initialize();
   abstract void startPlay();
   abstract void endPlay();

   //template method
   public final void play(){

      //initialize the game
      initialize();

      //start game
      startPlay();

      //end game
      endPlay();
   }
}

Adım 2

Yukarıdaki sınıfı genişleten somut sınıflar oluşturun.

Cricket.java

public class Cricket extends Game {

   @Override
   void endPlay() {
      System.out.println("Cricket Game Finished!");
   }

   @Override
   void initialize() {
      System.out.println("Cricket Game Initialized! Start playing.");
   }

   @Override
   void startPlay() {
      System.out.println("Cricket Game Started. Enjoy the game!");
   }
}

Football.java

public class Football extends Game {
   @Override
   void endPlay() {
      System.out.println("Football Game Finished!");
   }

   @Override
   void initialize() {
      System.out.println("Football Game Initialized! Start playing.");
   }

   @Override
   void startPlay() {
      System.out.println("Football Game Started. Enjoy the game!");
   }
}

Aşama 3

Kullanım Oyun oyunu oynarken tanımlanmış bir yol göstermek için 'ın şablon yöntemi play ().

TemplatePatternDemo.java

public class TemplatePatternDemo {
   public static void main(String[] args) {

      Game game = new Cricket();
      game.play();
      System.out.println();
      game = new Football();
      game.play();		
   }
}

4. adım

Çıkışı doğrulayın.

Cricket Game Initialized! Start playing.
Cricket Game Started. Enjoy the game!
Cricket Game Finished!

Football Game Initialized! Start playing.
Football Game Started. Enjoy the game!
Football Game Finished!

Ziyaretçi modelinde, bir eleman sınıfının yürütme algoritmasını değiştiren bir ziyaretçi sınıfı kullanırız. Böylelikle elemanın yürütme algoritması ziyaretçi değiştikçe değişiklik gösterebilir. Bu örüntü, davranış örüntüleri kategorisine girer. Modele göre, öğe nesnesinin ziyaretçi nesnesini kabul etmesi gerekir, böylece ziyaretçi nesnesi, öğe nesnesi üzerindeki işlemi gerçekleştirir.

Uygulama

Kabul işlemlerini tanımlayan bir ComputerPart arayüzü oluşturacağız . Klavye , Fare , Monitör ve Bilgisayar , ComputerPart arayüzünü uygulayan somut sınıflardır . Ziyaretçi sınıfı işlemlerini tanımlayacak başka bir arabirim olan ComputerPartVisitor tanımlayacağız. Bilgisayar , ilgili eylemi yapmak için somut ziyaretçi kullanır.

VisitorPatternDemo , demo sınıfımız ziyaretçi deseninin kullanımını göstermek için Computer , ComputerPartVisitor sınıflarını kullanacaktır.

Aşama 1

Elemanı temsil edecek bir arayüz tanımlayın.

ComputerPart.java

public interface class ComputerPart {
   public void accept(ComputerPartVisitor computerPartVisitor);
}

Adım 2

Yukarıdaki sınıfı genişleten somut sınıflar oluşturun.

Keyboard.java

public class Keyboard  implements ComputerPart {

   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      computerPartVisitor.visit(this);
   }
}

Monitor.java

public class Monitor  implements ComputerPart {

   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      computerPartVisitor.visit(this);
   }
}

Mouse.java

public class Mouse  implements ComputerPart {

   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      computerPartVisitor.visit(this);
   }
}

Computer.java

public class Computer implements ComputerPart {
	
   ComputerPart[] parts;

   public Computer(){
      parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};		
   } 


   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      for (int i = 0; i < parts.length; i++) {
         parts[i].accept(computerPartVisitor);
      }
      computerPartVisitor.visit(this);
   }
}

Aşama 3

Ziyaretçiyi temsil edecek bir arayüz tanımlayın.

ComputerPartVisitor.java

public interface ComputerPartVisitor {
	public void visit(Computer computer);
	public void visit(Mouse mouse);
	public void visit(Keyboard keyboard);
	public void visit(Monitor monitor);
}

4. adım

Yukarıdaki sınıfı uygulayarak somut ziyaretçi oluşturun.

ComputerPartDisplayVisitor.java

public class ComputerPartDisplayVisitor implements ComputerPartVisitor {

   @Override
   public void visit(Computer computer) {
      System.out.println("Displaying Computer.");
   }

   @Override
   public void visit(Mouse mouse) {
      System.out.println("Displaying Mouse.");
   }

   @Override
   public void visit(Keyboard keyboard) {
      System.out.println("Displaying Keyboard.");
   }

   @Override
   public void visit(Monitor monitor) {
      System.out.println("Displaying Monitor.");
   }
}

Adım 5

Kullanım ComputerPartDisplayVisitor kısımlarını görüntülemek için Bilgisayar .

VisitorPatternDemo.java

public class VisitorPatternDemo {
   public static void main(String[] args) {

      ComputerPart computer = new Computer();
      computer.accept(new ComputerPartDisplayVisitor());
   }
}

6. Adım

Çıkışı doğrulayın.

Displaying Mouse.
Displaying Keyboard.
Displaying Monitor.
Displaying Computer.

MVC Örüntüsü, Model-Görünüm-Denetleyici Kalıbı anlamına gelir. Bu model, uygulamanın endişelerini ayırmak için kullanılır.

  • Model- Model, veri taşıyan bir nesneyi veya JAVA POJO'yu temsil eder. Ayrıca, verileri değişirse denetleyiciyi güncelleme mantığına sahip olabilir.

  • View - Görünüm, modelin içerdiği verilerin görselleştirilmesini temsil eder.

  • Controller- Kontrolör hem Model hem de görünüm üzerinde hareket eder. Model nesnesine veri akışını kontrol eder ve veriler her değiştiğinde görünümü günceller. Görünüm ve Modeli ayrı tutar.

Uygulama

Model olarak hareket eden bir Öğrenci nesnesi oluşturacağız . StudentView , öğrenci ayrıntılarını konsolda yazdırabilen bir görünüm sınıfı olacak ve StudentController , verileri Öğrenci nesnesinde depolamak ve buna göre StudentView görünümünü güncellemekten sorumlu denetleyici sınıfıdır .

MVCPatternDemo , demo sınıfımız MVC modelinin kullanımını göstermek için StudentController'ı kullanacaktır.

Aşama 1

Model Oluşturun.

Student.java

public class Student {
   private String rollNo;
   private String name;
   public String getRollNo() {
      return rollNo;
   }
   public void setRollNo(String rollNo) {
      this.rollNo = rollNo;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}

Adım 2

Görünüm Oluşturun.

StudentView.java

public class StudentView {
   public void printStudentDetails(String studentName, String studentRollNo){
      System.out.println("Student: ");
      System.out.println("Name: " + studentName);
      System.out.println("Roll No: " + studentRollNo);
   }
}

Aşama 3

Denetleyici Oluşturun.

StudentController.java

public class StudentController {
   private Student model;
   private StudentView view;

   public StudentController(Student model, StudentView view){
      this.model = model;
      this.view = view;
   }

   public void setStudentName(String name){
      model.setName(name);		
   }

   public String getStudentName(){
      return model.getName();		
   }

   public void setStudentRollNo(String rollNo){
      model.setRollNo(rollNo);		
   }

   public String getStudentRollNo(){
      return model.getRollNo();		
   }

   public void updateView(){				
      view.printStudentDetails(model.getName(), model.getRollNo());
   }	
}

4. adım

MVC tasarım deseni kullanımını göstermek için StudentController yöntemlerini kullanın .

MVCPatternDemo.java

public class MVCPatternDemo {
   public static void main(String[] args) {

      //fetch student record based on his roll no from the database
      Student model  = retriveStudentFromDatabase();

      //Create a view : to write student details on console
      StudentView view = new StudentView();

      StudentController controller = new StudentController(model, view);

      controller.updateView();

      //update model data
      controller.setStudentName("John");

      controller.updateView();
   }

   private static Student retriveStudentFromDatabase(){
      Student student = new Student();
      student.setName("Robert");
      student.setRollNo("10");
      return student;
   }
}

Adım 5

Çıkışı doğrulayın.

Student: 
Name: Robert
Roll No: 10
Student: 
Name: Julie
Roll No: 10

İş Temsilcisi Kalıbı, sunum katmanını ve iş katmanını ayırmak için kullanılır. Temel olarak, sunum katmanı kodundaki iş katmanı koduna iletişimi veya uzaktan arama işlevini azaltmak için kullanılır. İşletme katmanında aşağıdaki tüzel kişilikler var.

  • Client - Sunum katmanı kodu JSP, sunucu uygulaması veya UI java kodu olabilir.

  • Business Delegate - Müşteri varlıklarının Business Service yöntemlerine erişim sağlamaları için tek bir giriş noktası sınıfı.

  • LookUp Service - Arama hizmeti nesnesi, göreceli iş uygulaması elde etmekten ve iş temsilcisi nesnesine iş nesnesi erişimi sağlamaktan sorumludur.

  • Business Service- Business Service arayüzü. Somut sınıflar, gerçek iş uygulama mantığını sağlamak için bu iş hizmetini uygular.

Uygulama

İş Temsilcisi modelinin çeşitli varlıklarını temsil eden bir Client , BusinessDelegate , BusinessService , LookUpService , JMSService ve EJBService oluşturacağız.

BusinessDelegatePatternDemo , demo sınıfımız İş Temsilcisi modelinin kullanımını göstermek için BusinessDelegate ve Client'ı kullanacaktır.

Aşama 1

BusinessService Arayüzü oluşturun.

BusinessService.java

public interface BusinessService {
   public void doProcessing();
}

Adım 2

Concreate Hizmet Sınıfları oluşturun.

EJBService.java

public class EJBService implements BusinessService {

   @Override
   public void doProcessing() {
      System.out.println("Processing task by invoking EJB Service");
   }
}

JMSService.java

public class JMSService implements BusinessService {

   @Override
   public void doProcessing() {
      System.out.println("Processing task by invoking JMS Service");
   }
}

Aşama 3

İş Arama Hizmeti oluşturun.

BusinessLookUp.java

public class BusinessLookUp {
   public BusinessService getBusinessService(String serviceType){
      if(serviceType.equalsIgnoreCase("EJB")){
         return new EJBService();
      }else {
         return new JMSService();
      }
   }
}

4. adım

İş Temsilcisi oluşturun.

BusinessLookUp.java

public class BusinessDelegate {
   private BusinessLookUp lookupService = new BusinessLookUp();
   private BusinessService businessService;
   private String serviceType;

   public void setServiceType(String serviceType){
      this.serviceType = serviceType;
   }

   public void doTask(){
      businessService = lookupService.getBusinessService(serviceType);
      businessService.doProcessing();		
   }
}

Adım 5

İstemci Oluşturun.

Student.java

public class Client {
	
   BusinessDelegate businessService;

   public Client(BusinessDelegate businessService){
      this.businessService  = businessService;
   }

   public void doTask(){		
      businessService.doTask();
   }
}

6. Adım

İş Temsilcisi modelini göstermek için BusinessDelegate ve Client sınıflarını kullanın.

BusinessDelegatePatternDemo.java

public class BusinessDelegatePatternDemo {
	
   public static void main(String[] args) {

      BusinessDelegate businessDelegate = new BusinessDelegate();
      businessDelegate.setServiceType("EJB");

      Client client = new Client(businessDelegate);
      client.doTask();

      businessDelegate.setServiceType("JMS");
      client.doTask();
   }
}

7. Adım

Çıkışı doğrulayın.

Processing task by invoking EJB Service
Processing task by invoking JMS Service

Kompozit Varlık deseni, EJB kalıcılık mekanizmasında kullanılır. Kompozit varlık, nesnelerin bir grafiğini temsil eden bir EJB varlık fasulyesidir. Bir kompozit varlık güncellendiğinde, dahili olarak bağımlı nesneler çekirdekleri, EJB varlık bean tarafından yönetildiği için otomatik olarak güncellenir. Kompozit Varlık Fasulyesi katılımcıları aşağıdadır.

  • Composite Entity - Birincil varlık fasulyesidir.Kaba taneli olabilir veya kalıcılık amacıyla kullanılmak üzere iri taneli bir nesne içerebilir.

  • Coarse-Grained Object-Bu nesne bağımlı nesneler içerir. Kendi yaşam döngüsüne sahiptir ve ayrıca bağımlı nesnelerin yaşam döngüsünü yönetir.

  • Dependent Object - Bağımlı nesneler, kalıcılık yaşam döngüsü için Coarse-Grained nesnesine bağlı olan bir nesnedir.

  • Strategies - Stratejiler, bir Kompozit Varlığın nasıl uygulanacağını temsil eder.

Uygulama

CompositeEntity olarak davranan CompositeEntity nesnesi oluşturacağız . CoarseGrainedObject , bağımlı nesneleri içeren bir sınıf olacaktır. CompositeEntityPatternDemo , demo sınıfımız , Composite Entity modelinin kullanımını göstermek için Client sınıfını kullanacaktır.

Aşama 1

Bağımlı Nesneler Oluşturun.

DependentObject1.java

public class DependentObject1 {
	
   private String data;

   public void setData(String data){
      this.data = data; 
   } 

   public String getData(){
      return data;
   }
}

DependentObject2.java

public class DependentObject2 {
	
   private String data;

   public void setData(String data){
      this.data = data; 
   } 

   public String getData(){
      return data;
   }
}

Adım 2

Kaba Taneli Nesne Oluşturun.

CoarseGrainedObject.java

public class CoarseGrainedObject {
   DependentObject1 do1 = new DependentObject1();
   DependentObject2 do2 = new DependentObject2();

   public void setData(String data1, String data2){
      do1.setData(data1);
      do2.setData(data2);
   }

   public String[] getData(){
      return new String[] {do1.getData(),do2.getData()};
   }
}

Aşama 3

Kompozit Varlık Oluşturun.

CompositeEntity.java

public class CompositeEntity {
   private CoarseGrainedObject cgo = new CoarseGrainedObject();

   public void setData(String data1, String data2){
      cgo.setData(data1, data2);
   }

   public String[] getData(){
      return cgo.getData();
   }
}

4. adım

Kompozit Varlık kullanmak için İstemci sınıfı oluşturun.

Client.java

public class Client {
   private CompositeEntity compositeEntity = new CompositeEntity();

   public void printData(){
      for (int i = 0; i < compositeEntity.getData().length; i++) {
         System.out.println("Data: " + compositeEntity.getData()[i]);
      }
   }

   public void setData(String data1, String data2){
      compositeEntity.setData(data1, data2);
   }
}

Adım 5

Kompozit Varlık tasarım modeli kullanımını göstermek için İstemciyi kullanın .

CompositeEntityPatternDemo.java

public class CompositeEntityPatternDemo {
   public static void main(String[] args) {
       Client client = new Client();
       client.setData("Test", "Data");
       client.printData();
       client.setData("Second Test", "Data1");
       client.printData();
   }
}

6. Adım

Çıkışı doğrulayın.

Data: Test
Data: Data
Data: Second Test
Data: Data1

Veri Erişim Nesne Modeli veya DAO modeli, düşük seviyeli veri erişim API'sini veya işlemleri yüksek seviyeli iş hizmetlerinden ayırmak için kullanılır. Veri Erişim Nesne Modeli katılımcıları aşağıdadır.

  • Data Access Object Interface - Bu arayüz, bir model nesne (ler) üzerinde gerçekleştirilecek standart işlemleri tanımlar.

  • Data Access Object concrete class-Bu sınıf yukarıdaki arayüzü uygular. Bu sınıf, veritabanı / xml veya başka herhangi bir depolama mekanizması olabilen bir veri kaynağından veri almaktan sorumludur.

  • Model Object or Value Object - Bu nesne, DAO sınıfı kullanılarak alınan verileri depolamak için get / set yöntemlerini içeren basit bir POJO'dur.

Uygulama

Model veya Değer Nesnesi olarak hareket eden bir Öğrenci nesnesi oluşturacağız . Student Dao , Veri Erişim Nesne Arayüzüdür . Student DaoImpl , Veri Erişim Nesne Arabirimi uygulayan somut bir sınıftır. DaoPatternDemo , demo sınıfımız Student Dao'nun Veri Erişim Nesnesi modelinin kullanımını gösterecek.

Aşama 1

Değer Nesnesi Yaratın.

Student.java

public class Student {
   private String name;
   private int rollNo;

   Student(String name, int rollNo){
      this.name = name;
      this.rollNo = rollNo;
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public int getRollNo() {
      return rollNo;
   }

   public void setRollNo(int rollNo) {
      this.rollNo = rollNo;
   }
}

Adım 2

Veri Erişim Nesne Arayüzü oluşturun.

Student Dao.java

import java.util.List;

public interface StudentDao {
   public List<Student> getAllStudents();
   public Student getStudent(int rollNo);
   public void updateStudent(Student student);
   public void deleteStudent(Student student);
}

Aşama 3

Yukarıdaki arayüzü uygulayan somut sınıf oluşturun.

Student DaoImpl.java

import java.util.ArrayList;
import java.util.List;

public class StudentDaoImpl implements StudentDao {
	
   //list is working as a database
   List<Student> students;

   public StudentDaoImpl(){
      students = new ArrayList<Student>();
      Student student1 = new Student("Robert",0);
      Student student2 = new Student("John",1);
      students.add(student1);
      students.add(student2);		
   }
   @Override
   public void deleteStudent(Student student) {
      students.remove(student.getRollNo());
      System.out.println("Student: Roll No " + student.getRollNo() 
         +", deleted from database");
   }

   //retrive list of students from the database
   @Override
   public List<Student> getAllStudents() {
      return students;
   }

   @Override
   public Student getStudent(int rollNo) {
      return students.get(rollNo);
   }

   @Override
   public void updateStudent(Student student) {
      students.get(student.getRollNo()).setName(student.getName());
      System.out.println("Student: Roll No " + student.getRollNo() 
         +", updated in the database");
   }
}

4. adım

Veri Erişim Nesnesi kalıp kullanımını göstermek için Student Dao'yu kullanın .

CompositeEntityPatternDemo.java

public class DaoPatternDemo {
   public static void main(String[] args) {
      StudentDao studentDao = new StudentDaoImpl();

      //print all students
      for (Student student : studentDao.getAllStudents()) {
         System.out.println("Student: [RollNo : "
            +student.getRollNo()+", Name : "+student.getName()+" ]");
      }


      //update student
      Student student =studentDao.getAllStudents().get(0);
      student.setName("Michael");
      studentDao.updateStudent(student);

      //get the student
      studentDao.getStudent(0);
      System.out.println("Student: [RollNo : "
         +student.getRollNo()+", Name : "+student.getName()+" ]");		
   }
}

Adım 5

Çıkışı doğrulayın.

Student: [RollNo : 0, Name : Robert ]
Student: [RollNo : 1, Name : John ]
Student: Roll No 0, updated in the database
Student: [RollNo : 0, Name : Michael ]

Ön kontrolör tasarım modeli, tüm taleplerin tek bir işleyici tarafından ele alınabilmesi için merkezi bir talep işleme mekanizması sağlamak için kullanılır. Bu işleyici, talebin kimlik doğrulaması / yetkilendirmesi / günlüğe kaydedilmesi veya takibini yapabilir ve ardından istekleri ilgili işleyicilere iletebilir. Bu tür tasarım modelinin varlıkları aşağıdadır.

  • Front Controller - Uygulamaya gelen her türlü istek için tek işleyici (web tabanlı / masaüstü tabanlı).

  • Dispatcher - Ön Denetleyici, isteği karşılık gelen belirli işleyiciye gönderebilen bir dağıtıcı nesnesi kullanabilir.

  • View - Görünümler, isteklerin yapıldığı nesnelerdir.

Uygulama

Bir FrontController , Dispatcher oluşturacağız ve buna uygun olarak Front Controller ve Dispatcher olarak davranacağız. HomeView ve StudentView istekleri ön denetleyiciye gelebilir kendisi için çeşitli görüşlerini temsil etmemektedir.

FrontControllerPatternDemo , demo sınıfımız FrontController'ı Ön Denetleyici Tasarım Modelini göstermek için kullanacaktır .

Aşama 1

Görünümler oluşturun.

HomeView.java

public class HomeView {
   public void show(){
      System.out.println("Displaying Home Page");
   }
}

StudentView.java

public class StudentView {
   public void show(){
      System.out.println("Displaying Student Page");
   }
}

Adım 2

Dağıtıcı oluşturun.

Dispatcher.java

public class Dispatcher {
   private StudentView studentView;
   private HomeView homeView;
   public Dispatcher(){
      studentView = new StudentView();
      homeView = new HomeView();
   }

   public void dispatch(String request){
      if(request.equalsIgnoreCase("STUDENT")){
         studentView.show();
      }else{
         homeView.show();
      }	
   }
}

Aşama 3

FrontController oluştur

Context.java

public class FrontController {
	
   private Dispatcher dispatcher;

   public FrontController(){
      dispatcher = new Dispatcher();
   }

   private boolean isAuthenticUser(){
      System.out.println("User is authenticated successfully.");
      return true;
   }

   private void trackRequest(String request){
      System.out.println("Page requested: " + request);
   }

   public void dispatchRequest(String request){
      //log each request
      trackRequest(request);
      //authenticate the user
      if(isAuthenticUser()){
         dispatcher.dispatch(request);
      }	
   }
}

4. adım

Ön Denetleyici Tasarım Modelini göstermek için FrontController'ı kullanın .

FrontControllerPatternDemo.java

public class FrontControllerPatternDemo {
   public static void main(String[] args) {
      FrontController frontController = new FrontController();
      frontController.dispatchRequest("HOME");
      frontController.dispatchRequest("STUDENT");
   }
}

Adım 5

Çıkışı doğrulayın.

Page requested: HOME
User is authenticated successfully.
Displaying Home Page
Page requested: STUDENT
User is authenticated successfully.
Displaying Student Page

Yakalayan filtre tasarım modeli, uygulamanın isteği veya yanıtı ile bazı ön işleme / son işlemler yapmak istediğimizde kullanılır. Filtreler, talebi gerçek hedef uygulamaya geçirmeden önce istek üzerine tanımlanır ve uygulanır. Filtreler, talebin kimlik doğrulaması / yetkilendirmesi / günlüğe kaydedilmesi veya takibini yapabilir ve ardından talepleri ilgili işleyicilere iletebilir. Bu tür tasarım modelinin varlıkları aşağıdadır.

  • Filter - Talep işleyicisi tarafından talebin yerine getirilmesinden önce veya sonra belirli görevi gerçekleştirecek filtre.

  • Filter Chain - Filtre Zinciri birden fazla filtre taşır ve bunların hedefte tanımlı sırayla yürütülmesine yardımcı olur.

  • Target - Hedef nesne, istek işleyicidir

  • Filter Manager - Filtre Yöneticisi, filtreleri ve Filtre Zincirini yönetir.

  • Client - İstemci, Hedef nesneye istek gönderen nesnedir.

Uygulama

Varlıklarımızı temsil eden çeşitli nesneler olarak FilterChain , FilterManager , Target , Client oluşturacağız . AuthenticationFilter ve DebugFilter somut filtreleri temsil eder.

InterceptingFilterDemo , demo sınıfımız, Intercepting Filter Design Pattern'i göstermek için Client'ı kullanacaktır .

Aşama 1

Filtre arayüzü oluşturun.

Filter.java

public interface Filter {
   public void execute(String request);
}

Adım 2

Somut filtreler oluşturun.

AuthenticationFilter.java

public class AuthenticationFilter implements Filter {
   public void execute(String request){
      System.out.println("Authenticating request: " + request);
   }
}

DebugFilter.java

public class DebugFilter implements Filter {
   public void execute(String request){
      System.out.println("request log: " + request);
   }
}

Aşama 3

Hedef Oluşturun

Target.java

public class Target {
   public void execute(String request){
      System.out.println("Executing request: " + request);
   }
}

4. adım

Filtre Zinciri Oluşturun

FilterChain.java

import java.util.ArrayList;
import java.util.List;

public class FilterChain {
   private List<Filter> filters = new ArrayList<Filter>();
   private Target target;

   public void addFilter(Filter filter){
      filters.add(filter);
   }

   public void execute(String request){
      for (Filter filter : filters) {
         filter.execute(request);
      }
      target.execute(request);
   }

   public void setTarget(Target target){
      this.target = target;
   }
}

Adım 5

Filtre Yöneticisi Oluştur

FilterManager.java

public class FilterManager {
   FilterChain filterChain;

   public FilterManager(Target target){
      filterChain = new FilterChain();
      filterChain.setTarget(target);
   }
   public void setFilter(Filter filter){
      filterChain.addFilter(filter);
   }

   public void filterRequest(String request){
      filterChain.execute(request);
   }
}

6. Adım

İstemci Oluştur

Client.java

public class Client {
   FilterManager filterManager;

   public void setFilterManager(FilterManager filterManager){
      this.filterManager = filterManager;
   }

   public void sendRequest(String request){
      filterManager.filterRequest(request);
   }
}

7. Adım

Önleme Filtresi Tasarım Modelini göstermek için İstemciyi kullanın .

FrontControllerPatternDemo.java

public class InterceptingFilterDemo {
   public static void main(String[] args) {
      FilterManager filterManager = new FilterManager(new Target());
      filterManager.setFilter(new AuthenticationFilter());
      filterManager.setFilter(new DebugFilter());

      Client client = new Client();
      client.setFilterManager(filterManager);
      client.sendRequest("HOME");
   }
}

8. Adım

Çıkışı doğrulayın.

Authenticating request: HOME
request log: HOME
Executing request: HOME

Servis bulucu tasarım modeli, JNDI aramasını kullanarak çeşitli servisleri bulmak istediğimizde kullanılır. Bir hizmet için JNDI aramanın yüksek maliyeti göz önüne alındığında, Hizmet Bulucu modeli önbelleğe alma tekniğini kullanır. İlk kez bir servis gerekli olduğunda, Servis Bulucu JNDI'da arar ve servis nesnesini önbelleğe alır. Servis Bulucu aracılığıyla daha fazla arama veya aynı servis, uygulamanın performansını büyük ölçüde artıran önbelleğinde yapılır. Bu tür tasarım modelinin varlıkları aşağıdadır.

  • Service- Talebi işleyecek olan Gerçek Hizmet. Bu tür bir hizmetin referansı JNDI sunucusunda incelenecektir.

  • Context / Initial Context -JNDI Bağlamı, arama amacıyla kullanılan hizmet referansını taşır.

  • Service Locator - Hizmet Bulucu, hizmetleri önbelleğe alarak JNDI aramasıyla hizmetleri almak için tek bir iletişim noktasıdır.

  • Cache - Yeniden kullanmak üzere hizmet referanslarını saklamak için önbellek

  • Client - İstemci, hizmetleri ServiceLocator aracılığıyla başlatan nesnedir.

Uygulama

Varlıklarımızı temsil eden çeşitli nesneler olarak bir ServiceLocator , InitialContext , Cache , Service oluşturacağız . Service1 ve Service2 somut hizmetleri temsil eder.

ServiceLocatorPatternDemo , demo sınıfımız burada bir müşteri olarak hareket ediyor ve Servis Konum Belirleyici Tasarım Modelini göstermek için ServiceLocator'ı kullanacak .

Aşama 1

Servis arayüzü oluşturun.

Service.java

public interface Service {
   public String getName();
   public void execute();
}

Adım 2

Somut hizmetler oluşturun.

Service1.java

public class Service1 implements Service {
   public void execute(){
      System.out.println("Executing Service1");
   }

   @Override
   public String getName() {
      return "Service1";
   }
}

Service2.java

public class Service2 implements Service {
   public void execute(){
      System.out.println("Executing Service2");
   }

   @Override
   public String getName() {
      return "Service2";
   }
}

Aşama 3

JNDI araması için InitialContext oluşturun

InitialContext.java

public class InitialContext {
   public Object lookup(String jndiName){
      if(jndiName.equalsIgnoreCase("SERVICE1")){
         System.out.println("Looking up and creating a new Service1 object");
         return new Service1();
      }else if (jndiName.equalsIgnoreCase("SERVICE2")){
         System.out.println("Looking up and creating a new Service2 object");
         return new Service2();
      }
      return null;		
   }
}

4. adım

Önbellek Oluştur

Cache.java

import java.util.ArrayList;
import java.util.List;

public class Cache {

   private List<Service> services;

   public Cache(){
      services = new ArrayList<Service>();
   }

   public Service getService(String serviceName){
      for (Service service : services) {
         if(service.getName().equalsIgnoreCase(serviceName)){
            System.out.println("Returning cached  "+serviceName+" object");
            return service;
         }
      }
      return null;
   }

   public void addService(Service newService){
      boolean exists = false;
      for (Service service : services) {
         if(service.getName().equalsIgnoreCase(newService.getName())){
            exists = true;
         }
      }
      if(!exists){
         services.add(newService);
      }
   }
}

Adım 5

Servis Bulucu Oluştur

ServiceLocator.java

public class ServiceLocator {
   private static Cache cache;

   static {
      cache = new Cache();		
   }

   public static Service getService(String jndiName){

      Service service = cache.getService(jndiName);

      if(service != null){
         return service;
      }

      InitialContext context = new InitialContext();
      Service service1 = (Service)context.lookup(jndiName);
      cache.addService(service1);
      return service1;
   }
}

6. Adım

Kullanım ServiceLocator Servis Bulucu Tasarım Desen göstermek için.

ServiceLocatorPatternDemo.java

public class ServiceLocatorPatternDemo {
   public static void main(String[] args) {
      Service service = ServiceLocator.getService("Service1");
      service.execute();
      service = ServiceLocator.getService("Service2");
      service.execute();
      service = ServiceLocator.getService("Service1");
      service.execute();
      service = ServiceLocator.getService("Service2");
      service.execute();		
   }
}

7. Adım

Çıkışı doğrulayın.

Looking up and creating a new Service1 object
Executing Service1
Looking up and creating a new Service2 object
Executing Service2
Returning cached  Service1 object
Executing Service1
Returning cached  Service2 object
Executing Service2

Aktarım Nesnesi kalıbı, istemciden sunucuya tek seferde birden çok özniteliğe sahip verileri iletmek istediğimizde kullanılır. Transfer nesnesi aynı zamanda Değer Nesnesi olarak da bilinir. Transfer Object, alıcı / ayarlayıcı yöntemlerine sahip basit bir POJO sınıfıdır ve ağ üzerinden aktarılabilmesi için serileştirilebilir. Herhangi bir davranışı yoktur. Sunucu Tarafı iş sınıfı normalde veritabanından verileri alır ve POJO'yu doldurur ve istemciye gönderir veya değerine göre iletir. İstemci için aktarım nesnesi salt okunurdur. Müşteri, kendi transfer nesnesini oluşturabilir ve veri tabanındaki değerleri tek seferde güncellemek için sunucuya iletebilir. Bu tür tasarım modelinin varlıkları aşağıdadır.

  • Business Object - Transfer Nesnesini verilerle dolduran İşletme Hizmeti.

  • Transfer Object -Simple POJO, yalnızca öznitelikleri ayarlama / alma yöntemlerine sahip.

  • Client - Müşteri, Transfer Nesnesini İş Nesnesine ister veya gönderir.

Uygulama

Biz oluşturmak için gidiyoruz StudentBO iş nesnesi olarak Öğrenci bizim varlıkları temsil Transferi Nesnesi olarak.

TransferObjectPatternDemo , demo sınıfımız burada bir müşteri olarak hareket ediyor ve Transfer Nesnesi Tasarım Modelini göstermek için StudentBO ve Student'ı kullanacak.

Aşama 1

Transfer Nesnesi Oluşturun.

StudentVO.java

public class StudentVO {
   private String name;
   private int rollNo;

   StudentVO(String name, int rollNo){
      this.name = name;
      this.rollNo = rollNo;
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public int getRollNo() {
      return rollNo;
   }

   public void setRollNo(int rollNo) {
      this.rollNo = rollNo;
   }
}

Adım 2

İş Nesnesi Oluşturun.

StudentBO.java

import java.util.ArrayList;
import java.util.List;

public class StudentBO {
	
   //list is working as a database
   List<StudentVO> students;

   public StudentBO(){
      students = new ArrayList<StudentVO>();
      StudentVO student1 = new StudentVO("Robert",0);
      StudentVO student2 = new StudentVO("John",1);
      students.add(student1);
      students.add(student2);		
   }
   public void deleteStudent(StudentVO student) {
      students.remove(student.getRollNo());
      System.out.println("Student: Roll No " 
      + student.getRollNo() +", deleted from database");
   }

   //retrive list of students from the database
   public List<StudentVO> getAllStudents() {
      return students;
   }

   public StudentVO getStudent(int rollNo) {
      return students.get(rollNo);
   }

   public void updateStudent(StudentVO student) {
      students.get(student.getRollNo()).setName(student.getName());
      System.out.println("Student: Roll No " 
      + student.getRollNo() +", updated in the database");
   }
}

Aşama 3

Transfer Nesnesi Tasarım Modelini göstermek için StudentBO kullanın .

TransferObjectPatternDemo.java

public class TransferObjectPatternDemo {
   public static void main(String[] args) {
      StudentBO studentBusinessObject = new StudentBO();

      //print all students
      for (StudentVO student : studentBusinessObject.getAllStudents()) {
         System.out.println("Student: [RollNo : "
         +student.getRollNo()+", Name : "+student.getName()+" ]");
      }

      //update student
      StudentVO student =studentBusinessObject.getAllStudents().get(0);
      student.setName("Michael");
      studentBusinessObject.updateStudent(student);

      //get the student
      studentBusinessObject.getStudent(0);
      System.out.println("Student: [RollNo : "
      +student.getRollNo()+", Name : "+student.getName()+" ]");
   }
}

4. adım

Çıkışı doğrulayın.

Student: [RollNo : 0, Name : Robert ]
Student: [RollNo : 1, Name : John ]
Student: Roll No 0, updated in the database
Student: [RollNo : 0, Name : Michael ]