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 ]