├── .gitignore ├── .idea ├── .gitignore ├── description.html ├── misc.xml ├── modules.xml ├── project-template.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── src └── com │ └── company │ ├── Behavioraldesignpatterns │ ├── chain_of_responsibility │ │ ├── Client.java │ │ ├── Dean.java │ │ ├── Handler.java │ │ ├── Principal.java │ │ ├── Secretary.java │ │ └── Tutor.java │ ├── commandpatterns │ │ ├── Client.java │ │ ├── CommandProcessor.java │ │ ├── OrderAddCommand.java │ │ ├── OrderCommand.java │ │ └── OrderPayCommand.java │ ├── iterator │ │ ├── Book.java │ │ ├── BookIterable.java │ │ ├── Client.java │ │ ├── Iterator.java │ │ ├── Literature.java │ │ └── LiteratureIterator.java │ ├── mediator │ │ ├── ChatMediator.java │ │ ├── ChatMediatorImpl.java │ │ ├── Client.java │ │ ├── User.java │ │ └── UserImpl.java │ ├── memento │ │ ├── Caretaker.java │ │ ├── Client.java │ │ ├── Memento.java │ │ └── ToDo.java │ ├── observer │ │ ├── Bookstore.java │ │ ├── Client.java │ │ ├── Magazine.java │ │ ├── Observer.java │ │ ├── Subject.java │ │ └── Subscriber.java │ ├── state │ │ ├── Client.java │ │ ├── GameOverState.java │ │ ├── GameStartState.java │ │ ├── GameState.java │ │ └── Player.java │ ├── strategy │ │ ├── Client.java │ │ ├── Context.java │ │ ├── GoToCairo.java │ │ ├── GoToGona.java │ │ └── Strategy.java │ ├── template_method │ │ ├── AssemblyLine.java │ │ ├── Client.java │ │ ├── ComputerAssemblyLine.java │ │ └── RadioAssemblyLine.java │ └── visitor │ │ ├── Applicant.java │ │ ├── Client.java │ │ ├── Engineer.java │ │ ├── Interviewer.java │ │ ├── LaborMarket.java │ │ ├── Leader.java │ │ └── Student.java │ ├── Creationaldesignpattern │ ├── Prototype │ │ └── WordDocument.java │ ├── abstractfactory │ │ ├── CakeCream.java │ │ ├── CakeFactory.java │ │ ├── CakeStyle.java │ │ ├── Client.java │ │ ├── HeartStyle.java │ │ ├── MangoCream.java │ │ ├── MangoHeartCake.java │ │ ├── MangoSquareCake.java │ │ └── SquareStyle.java │ ├── builder │ │ ├── Builder.java │ │ ├── Car.java │ │ ├── CarBuilder.java │ │ ├── Client.java │ │ └── Director.java │ ├── factory │ │ ├── Cake.java │ │ ├── CakeFactory.java │ │ ├── Client.java │ │ ├── Factory.java │ │ └── MangoCake.java │ └── singleton │ │ └── Counter.java │ └── Structuraldesignpatterns │ ├── adapter │ ├── Client.java │ ├── Volt220.java │ ├── VoltAdapter.java │ └── VoltFive.java │ ├── decorator │ ├── Cake.java │ ├── CakeEmbryo.java │ ├── DecoratorCake.java │ ├── FruitCake.java │ └── client.java │ ├── facade │ ├── Client.java │ ├── Frenchkitchen.java │ ├── FrenchkitchenImpl.java │ ├── Italykitchen.java │ ├── ItalykitchenImpl.java │ └── Menu.java │ ├── flyweight │ ├── Client.java │ ├── MovieTicket.java │ ├── Ticket.java │ └── TicketFactory.java │ └── proxy │ ├── Client.java │ ├── IPicker.java │ ├── ProxyPicker.java │ └── RealPicker.java └── untitled104.iml /.gitignore: -------------------------------------------------------------------------------- 1 | # Project exclude paths 2 | /out/ -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /.idea/description.html: -------------------------------------------------------------------------------- 1 | Simple Java application that includes a class with main() method -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/project-template.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DesignPatterns-Java 2 | 3 | ## Design Patterns 4 | - In software engineering, a design pattern is a general repeatable solution to a commonly occurring problem in software design. A design pattern isn't a finished design that can be transformed directly into code. It is a description or template for how to solve a problem that can be used in many different situations. 5 | ## Creational design patterns 6 | - Singleton 7 | - Prototype 8 | - Object Pool 9 | - Factory Method 10 | - Builder 11 | - Abstract Factory 12 | 13 | 14 | ## Structural design patterns 15 | - Adapter 16 | - Bridge 17 | - Composite 18 | - Decorator 19 | - Facade 20 | - Flyweight 21 | - Private Class Data 22 | - Proxy 23 | 24 | ## Behavioral design patterns 25 | - Chain of responsibility 26 | - Command 27 | - Interpreter 28 | - Iterator 29 | - Mediator 30 | - Memento 31 | - Null Object 32 | - Observer 33 | - State 34 | - Strategy 35 | - Template method 36 | - Visitor 37 | 38 | 39 | 40 | ## Creational design patterns 41 | 42 | >In software engineering, creational design patterns are design patterns that deal with object creation mechanisms, trying to create objects in a manner suitable to the situation. The basic form of object creation could result in design problems or added complexity to the design. Creational design patterns solve this problem by somehow controlling this object creation. 43 | > 44 | 45 | ### Singleton 46 | 47 | The singleton pattern ensures that only one object of a particular class is ever created. All further references to objects of the singleton class refer to the same underlying instance. There are very few applications, do not overuse this pattern! 48 | 49 | ## UML : 50 | 51 | 52 | 53 | ### Example: 54 | 55 | ```java 56 | public class Counter { 57 | 58 | public int count = 0; 59 | 60 | private static Counter instance = new Counter(); 61 | 62 | private Counter() { 63 | } 64 | 65 | public static Counter getInstance() { 66 | return instance; 67 | } 68 | 69 | public void addOne() { 70 | count++; 71 | } 72 | } 73 | ``` 74 | 75 | ### Usage : 76 | 77 | ```java 78 | Counter obj1 = Counter.getInstance(); 79 | Counter obj2 = Counter.getInstance(); 80 | obj1.addOne(); 81 | obj2.addOne(); 82 | System.out.println("Counter 1 : " + obj1.count); 83 | System.out.println("Counter 2 : " + obj2.count); 84 | 85 | obj1.addOne(); 86 | obj2.addOne(); 87 | System.out.println("Counter 1 : " + obj1.count); 88 | System.out.println("Counter 2 : " + obj2.count); 89 | ``` 90 | 91 | ### Output : 92 | 93 | ```code 94 | Counter 1 : 2 95 | Counter 2 : 2 96 | Counter 1 : 4 97 | Counter 2 : 4 98 | ``` 99 | 100 | ## 101 | ## prototype 102 | The Prototype pattern delegates the cloning process to the actual objects that are being cloned. The pattern declares a common interface for all objects that support cloning. This interface lets you clone an object without coupling your code to the class of that object. Usually, such an interface contains just a single clone method. 103 | 104 | The implementation of the clone method is very similar in all classes. The method creates an object of the current class and carries over all of the field values of the old object into the new one. You can even copy private fields because most programming languages let objects access private fields of other objects that belong to the same class. 105 | 106 | An object that supports cloning is called a prototype. When your objects have dozens of fields and hundreds of possible configurations, cloning them might serve as an alternative to subclassing. 107 | 108 | ## UML : 109 | 110 | 111 | 112 | ### Example: 113 | 114 | 115 | ```java 116 | import java.util.ArrayList; 117 | 118 | public class WordDocument implements Cloneable { 119 | 120 | private String text; 121 | private ArrayList images = new ArrayList<>(); 122 | 123 | public WordDocument() { 124 | System.out.println("-----Init-----"); 125 | } 126 | 127 | public String getText() { 128 | return text; 129 | } 130 | 131 | public void setText(String text) { 132 | this.text = text; 133 | } 134 | 135 | public ArrayList getImages() { 136 | return images; 137 | } 138 | 139 | public void setImages(ArrayList images) { 140 | this.images = images; 141 | } 142 | 143 | public void addImage(String image) { 144 | images.add(image); 145 | } 146 | 147 | public void showDocument() { 148 | System.out.println("-----Start-----"); 149 | System.out.println("Text : " + text); 150 | System.out.println("Image List : "); 151 | for (String mImage : images) { 152 | System.out.println("Image Name : " + mImage); 153 | } 154 | System.out.println("-----End-----"); 155 | } 156 | 157 | protected WordDocument clone() { 158 | try { 159 | WordDocument copy = (WordDocument) super.clone(); 160 | copy.text = this.text; 161 | // copy.images = this.images; 162 | copy.images = (ArrayList) this.images.clone(); 163 | return copy; 164 | } catch (CloneNotSupportedException e) { 165 | e.printStackTrace(); 166 | } 167 | return null; 168 | } 169 | 170 | ``` 171 | 172 | ### Usage : 173 | 174 | ```java 175 | public static void main(String[] args) { 176 | WordDocument originDoc = new WordDocument(); 177 | originDoc.setText("This is a document"); 178 | originDoc.addImage("Image 1"); 179 | originDoc.addImage("Image 2"); 180 | originDoc.addImage("Image 3"); 181 | originDoc.showDocument(); 182 | 183 | WordDocument copyDoc = originDoc.clone(); 184 | copyDoc.showDocument(); 185 | 186 | copyDoc.setText("This is a copy document"); 187 | 188 | // add this line to test the origin document what will happen after the copy document add a image 189 | copyDoc.addImage("a new Image"); 190 | 191 | 192 | copyDoc.showDocument(); 193 | copyDoc.showDocument(); 194 | } 195 | ``` 196 | ## Output: 197 | 198 | ```code 199 | -----Init----- 200 | -----Start----- 201 | Text: This is a document 202 | Images List: 203 | Image name: Image 1 204 | Image name: Image 2 205 | Image name: Image 3 206 | -----End----- 207 | -----Start----- 208 | Text: This is a document 209 | Images List: 210 | Image name: Image 1 211 | Image name: Image 2 212 | Image name: Image 3 213 | -----End----- 214 | -----Start----- 215 | Text: This is a copy document 216 | Images List: 217 | Image name: Image 1 218 | Image name: Image 2 219 | Image name: Image 3 220 | Image name: A new image 221 | -----End----- 222 | -----Start----- 223 | Text: This is a copy document 224 | Images List: 225 | Image name: Image 1 226 | Image name: Image 2 227 | Image name: Image 3 228 | Image name: A new image 229 | -----End----- 230 | 231 | ``` 232 | 233 | ## 234 | ## Builder 235 | The builder pattern is used to create complex objects with constituent parts that must be created in the same order or using a specific algorithm. An external class controls the construction algorithm. 236 | 237 | ## UML : 238 | 239 | 240 | 241 | ### Example: 242 | 243 | ```java 244 | public class Car { 245 | private String color; 246 | private String licensePlate; 247 | private String brand; 248 | 249 | public void setColor(String color) { 250 | this.color = color; 251 | } 252 | 253 | public void setLicensePlate(String licensePlate) { 254 | this.licensePlate = licensePlate; 255 | } 256 | 257 | public void setBrand(String brand) { 258 | this.brand = brand; 259 | } 260 | 261 | @Override 262 | public String toString() { 263 | return "Car{" + 264 | "color='" + color + '\'' + 265 | ", licensePlate='" + licensePlate + '\'' + 266 | ", brand='" + brand + '\'' + 267 | '}'; 268 | } 269 | } 270 | 271 | ``` 272 | 273 | ```java 274 | public interface Builder { 275 | void builderColor(String color); 276 | 277 | void builderLicensePlate(String licensePlate); 278 | 279 | void builderBrand(String brand); 280 | 281 | Car build(); 282 | } 283 | 284 | ``` 285 | 286 | ```java 287 | public class CarBuilder implements Builder { 288 | 289 | Car car; 290 | 291 | public CarBuilder() { 292 | car = new Car(); 293 | } 294 | 295 | @Override 296 | public void builderColor(String color) { 297 | car.setColor(color); 298 | } 299 | 300 | @Override 301 | public void builderLicensePlate(String licensePlate) { 302 | car.setLicensePlate(licensePlate); 303 | } 304 | 305 | @Override 306 | public void builderBrand(String brand) { 307 | car.setBrand(brand); 308 | } 309 | 310 | @Override 311 | public Car build() { 312 | return car; 313 | } 314 | } 315 | 316 | ``` 317 | 318 | ```java 319 | public class Director { 320 | 321 | Builder builder; 322 | 323 | public Director(Builder builder) { 324 | this.builder = builder; 325 | } 326 | 327 | 328 | public void construct(String color, String licensePlate, String brand) { 329 | builder.builderColor(color); 330 | builder.builderLicensePlate(licensePlate); 331 | builder.builderBrand(brand); 332 | } 333 | } 334 | 335 | ``` 336 | 337 | ### Usage : 338 | 339 | ```java 340 | Builder builder = new CarBuilder(); 341 | Director director = new Director(builder); 342 | director.construct("Red","A88888","Ferrari"); 343 | System.out.println(builder.build().toString()); 344 | ``` 345 | 346 | ### Outpu: 347 | 348 | ```code 349 | Car{color='Red', licensePlate='A88888', brand='Ferrari'} 350 | ``` 351 | 352 | 353 | 354 | 355 | ## 356 | ## Factory Method 357 | The factory pattern is used to replace class constructors, abstracting the process of object generation so that the type of the object instantiated can be determined at run-time. 358 | 359 | ## UML : 360 | 361 | 362 | 363 | ### Example: 364 | 365 | ```java 366 | public interface Cake { 367 | void prepareMaterials(); 368 | 369 | void baking(); 370 | } 371 | 372 | ``` 373 | 374 | ```java 375 | public class MangoCake implements Cake{ 376 | @Override 377 | public void prepareMaterials() { 378 | System.out.println("prepare Mango Cream"); 379 | } 380 | 381 | @Override 382 | public void baking() { 383 | System.out.println("Baking ten minutes"); 384 | } 385 | } 386 | 387 | ``` 388 | 389 | ```java 390 | public abstract class Factory { 391 | public abstract T createProduct(Class clz); 392 | } 393 | 394 | ``` 395 | 396 | ```java 397 | public class CakeFactory extends Factory{ 398 | 399 | @Override 400 | public T createProduct(Class clz) { 401 | Cake cake = null; 402 | try { 403 | cake = (Cake) Class.forName(clz.getName()).getDeclaredConstructor().newInstance(); 404 | }catch (Exception e) { 405 | e.printStackTrace(); 406 | } 407 | return (T) cake; 408 | } 409 | } 410 | 411 | 412 | ``` 413 | 414 | 415 | 416 | ### Usage : 417 | 418 | ```java 419 | Factory factory = new CakeFactory(); 420 | MangoCake mangoCake = factory.createProduct(MangoCake.class); 421 | mangoCake.prepareMaterials(); 422 | mangoCake.baking(); 423 | ``` 424 | 425 | ### Outpu: 426 | 427 | ```code 428 | prepare Mango Cream 429 | Baking ten minutes 430 | ``` 431 | 432 | 433 | 434 | 435 | ## 436 | ## Abstract Factory 437 | The abstract factory pattern is used to provide a client with a set of related or dependant objects. The "family" of objects created by the factory are determined at run-time. 438 | 439 | ## UML : 440 | 441 | 442 | 443 | ### Example: 444 | 445 | ```java 446 | public abstract class CakeFactory { 447 | public abstract CakeCream cream(); 448 | public abstract CakeStyle style(); 449 | } 450 | 451 | ``` 452 | 453 | ```java 454 | public abstract class CakeCream { 455 | public abstract void cream(); 456 | } 457 | 458 | ``` 459 | 460 | ```java 461 | public abstract class CakeStyle { 462 | public abstract void style(); 463 | } 464 | 465 | ``` 466 | 467 | ```java 468 | public class HeartStyle extends CakeStyle{ 469 | @Override 470 | public void style() { 471 | System.out.println("Heart Style"); 472 | } 473 | } 474 | 475 | ``` 476 | 477 | ```java 478 | public class MangoCream extends CakeCream{ 479 | @Override 480 | public void cream() { 481 | System.out.println("Mango Cream"); 482 | } 483 | } 484 | 485 | 486 | ``` 487 | 488 | ```java 489 | public class MangoHeartCake extends CakeFactory{ 490 | @Override 491 | public CakeCream cream() { 492 | return new MangoCream() ; 493 | } 494 | 495 | @Override 496 | public CakeStyle style() { 497 | return new HeartStyle(); 498 | } 499 | } 500 | 501 | 502 | ``` 503 | 504 | 505 | 506 | 507 | ### Usage : 508 | 509 | ```java 510 | CakeFactory mangoHeartCake = new MangoHeartCake(); 511 | mangoHeartCake.cream().cream(); 512 | mangoHeartCake.style().style(); 513 | 514 | System.out.println("================="); 515 | 516 | CakeFactory mangoSquareCake = new MangoSquareCake(); 517 | mangoSquareCake.cream().cream(); 518 | mangoSquareCake.style().style(); 519 | ``` 520 | 521 | ### Outpu: 522 | 523 | ```code 524 | Mango Cream 525 | Heart Style 526 | ================= 527 | Mango Cream 528 | Square Style 529 | ``` 530 | 531 | 532 | ## 533 | ## Structural Patterns : 534 | 535 | >In software engineering, structural design patterns are design patterns that ease the design by identifying a simple way to realize relationships between entities. 536 | > 537 | 538 | ## Protection Proxy 539 | The proxy pattern is used to provide a surrogate or placeholder object, which references an underlying object. Protection proxy is restricting access. 540 | 541 | 542 | ## UML : 543 | 544 | 545 | 546 | ### Example: 547 | 548 | ```java 549 | public interface IPicker { 550 | void receiveMessage(); 551 | 552 | void takeCourier(); 553 | 554 | void signatureAcceptance(); 555 | 556 | } 557 | 558 | ``` 559 | 560 | ```java 561 | public class RealPicker implements IPicker{ 562 | @Override 563 | public void receiveMessage() { 564 | System.out.println("Receive text Message"); 565 | } 566 | 567 | @Override 568 | public void takeCourier() { 569 | System.out.println("Take the Courier"); 570 | } 571 | 572 | @Override 573 | public void signatureAcceptance() { 574 | System.out.println("Signature Acceptance"); 575 | } 576 | } 577 | 578 | 579 | ``` 580 | 581 | ```java 582 | public class ProxyPicker implements IPicker { 583 | 584 | private IPicker picker; 585 | 586 | public ProxyPicker(IPicker picker) { 587 | this.picker = picker; 588 | } 589 | 590 | @Override 591 | public void receiveMessage() { 592 | picker.receiveMessage(); 593 | } 594 | 595 | @Override 596 | public void takeCourier() { 597 | picker.takeCourier(); 598 | } 599 | 600 | @Override 601 | public void signatureAcceptance() { 602 | picker.signatureAcceptance(); 603 | } 604 | } 605 | 606 | ``` 607 | 608 | 609 | 610 | ### Usage : 611 | 612 | ```java 613 | IPicker picker = new RealPicker(); 614 | ProxyPicker proxyPicker = new ProxyPicker(picker); 615 | 616 | proxyPicker.receiveMessage(); 617 | proxyPicker.takeCourier(); 618 | proxyPicker.signatureAcceptance(); 619 | ``` 620 | 621 | ### Outpu: 622 | 623 | ```code 624 | Receive text Message 625 | Take the Courier 626 | Signature Acceptance 627 | ``` 628 | 629 | 630 | 631 | ## Decorator 632 | The decorator pattern is used to extend or alter the functionality of objects at run-time by wrapping them in an object of a decorator class. This provides a flexible alternative to using inheritance to modify behaviour. 633 | 634 | ## UML : 635 | 636 | 637 | 638 | ### Example: 639 | 640 | ```java 641 | public interface Cake { 642 | 643 | void make(); 644 | } 645 | 646 | ``` 647 | 648 | ```java 649 | public class CakeEmbryo implements Cake{ 650 | @Override 651 | public void make() { 652 | System.out.println("Baking Cake"); 653 | } 654 | } 655 | 656 | ``` 657 | 658 | ```java 659 | public abstract class DecoratorCake implements Cake { 660 | Cake cake; 661 | 662 | public DecoratorCake(Cake cake) { 663 | this.cake = cake; 664 | } 665 | 666 | @Override 667 | public void make() { 668 | cake.make(); 669 | } 670 | } 671 | 672 | ``` 673 | 674 | ```java 675 | public class FruitCake extends DecoratorCake{ 676 | 677 | public FruitCake(Cake cake) { 678 | super(cake); 679 | } 680 | 681 | @Override 682 | public void make() { 683 | addSomeFruit(); 684 | super.make(); 685 | } 686 | 687 | private void addSomeFruit(){ 688 | System.out.println("Add Some fruit"); 689 | } 690 | } 691 | 692 | ``` 693 | 694 | 695 | 696 | ### Usage : 697 | 698 | ```java 699 | Cake cake = new CakeEmbryo(); 700 | cake.make(); 701 | 702 | System.out.println("--------Decorate Fruit Cake--------"); 703 | DecoratorCake fruitCake = new FruitCake(cake); 704 | fruitCake.make(); 705 | ``` 706 | 707 | ### Outpu: 708 | 709 | ```code 710 | Baking Cake 711 | --------Decorate Fruit Cake-------- 712 | Add Some fruit 713 | Baking Cake 714 | ``` 715 | 716 | 717 | ## Adapter 718 | The adapter pattern is used to provide a link between two otherwise incompatible types by wrapping the "adaptee" with a class that supports the interface required by the client. 719 | 720 | ## UML : 721 | 722 | 723 | 724 | ### Example: 725 | 726 | ```java 727 | public interface VoltFive { 728 | int provideVoltFive(); 729 | } 730 | 731 | ``` 732 | 733 | ```java 734 | public class Volt220 { 735 | public int provideVolt220(){ 736 | return 220; 737 | } 738 | } 739 | 740 | ``` 741 | 742 | ```java 743 | public class VoltAdapter implements VoltFive{ 744 | 745 | private Volt220 volt220; 746 | 747 | public VoltAdapter(Volt220 volt220) { 748 | this.volt220 = volt220; 749 | } 750 | 751 | @Override 752 | public int provideVoltFive() { 753 | int volt = volt220.provideVolt220(); 754 | return 5; 755 | } 756 | 757 | public int provideVolt220() { 758 | return volt220.provideVolt220(); 759 | } 760 | 761 | } 762 | 763 | ``` 764 | 765 | 766 | ### Usage : 767 | 768 | ```java 769 | Volt220 volt220 = new Volt220(); 770 | VoltAdapter adapter = new VoltAdapter(volt220); 771 | 772 | int volt = adapter.provideVoltFive(); 773 | System.out.println("After adapter, the volt is :" + volt); 774 | ``` 775 | 776 | ### Outpu: 777 | 778 | ```code 779 | After adapter, the volt is :5 780 | ``` 781 | 782 | 783 | 784 | 785 | ## Facade 786 | The facade pattern is used to define a simplified interface to a more complex subsystem. 787 | 788 | ## UML : 789 | 790 | 791 | 792 | ### Example: 793 | 794 | ```java 795 | public interface Italykitchen { 796 | 797 | void lasagneWithTomatoAndCheese(); 798 | 799 | void prawnRisotto(); 800 | 801 | void creamCaramel(); 802 | 803 | 804 | } 805 | 806 | ``` 807 | 808 | ```java 809 | public class ItalykitchenImpl implements Italykitchen{ 810 | @Override 811 | public void lasagneWithTomatoAndCheese() { 812 | System.out.println("Lasagne With Tomato And Cheese"); 813 | } 814 | 815 | @Override 816 | public void prawnRisotto() { 817 | System.out.println("Prawn Risotto"); 818 | } 819 | 820 | @Override 821 | public void creamCaramel() { 822 | System.out.println("Cream Caramel"); 823 | } 824 | } 825 | 826 | ``` 827 | 828 | ```java 829 | public interface Frenchkitchen { 830 | 831 | void bouillabaisse(); 832 | 833 | void cassoulet(); 834 | 835 | void pouleAuPot(); 836 | } 837 | 838 | 839 | ``` 840 | 841 | ```java 842 | public class FrenchkitchenImpl implements Frenchkitchen{ 843 | @Override 844 | public void bouillabaisse() { 845 | System.out.println("Bouillabaisse"); 846 | } 847 | 848 | @Override 849 | public void cassoulet() { 850 | System.out.println("Cassoulet"); 851 | } 852 | 853 | @Override 854 | public void pouleAuPot() { 855 | System.out.println("PouleAuPot"); 856 | } 857 | } 858 | 859 | 860 | ``` 861 | 862 | ```java 863 | public class Menu { 864 | private Italykitchen italykitchen; 865 | private Frenchkitchen frenchkitchen; 866 | 867 | public Menu() { 868 | italykitchen = new ItalykitchenImpl(); 869 | frenchkitchen = new FrenchkitchenImpl(); 870 | } 871 | 872 | 873 | public void bouillabaisse() { 874 | frenchkitchen.bouillabaisse(); 875 | } 876 | 877 | public void cassoulet() { 878 | frenchkitchen.cassoulet(); 879 | } 880 | 881 | public void pouleAuPot() { 882 | frenchkitchen.pouleAuPot(); 883 | } 884 | 885 | public void lasagneWithTomatoAndCheese() { 886 | italykitchen.lasagneWithTomatoAndCheese(); 887 | } 888 | 889 | public void prawnRisotto() { 890 | italykitchen.prawnRisotto(); 891 | } 892 | 893 | public void creamCaramel() { 894 | italykitchen.creamCaramel(); 895 | } 896 | 897 | 898 | } 899 | 900 | ``` 901 | 902 | 903 | ### Usage : 904 | 905 | ```java 906 | Menu menu = new Menu(); 907 | 908 | System.out.println("Customer order"); 909 | menu.lasagneWithTomatoAndCheese(); 910 | menu.creamCaramel(); 911 | 912 | System.out.println("===========New Order=========="); 913 | System.out.println("Customer two orders"); 914 | menu.bouillabaisse(); 915 | menu.prawnRisotto(); 916 | ``` 917 | 918 | ### Outpu: 919 | 920 | ```code 921 | Customer order 922 | Lasagne With Tomato And Cheese 923 | Cream Caramel 924 | ===========New Order========== 925 | Customer two orders 926 | Bouillabaisse 927 | Prawn Risotto 928 | ``` 929 | 930 | 931 | ## Flyweight 932 | Flyweight is a structural design pattern that lets you fit more objects into the available amount of RAM by sharing common parts of state between multiple objects instead of keeping all of the data in each object. 933 | 934 | ## UML : 935 | 936 | 937 | 938 | ### Example: 939 | 940 | ```java 941 | public interface Ticket { 942 | public void printTicket(String time, String seat); 943 | } 944 | 945 | ``` 946 | 947 | ```java 948 | public class TicketFactory { 949 | 950 | private static Map map = new ConcurrentHashMap<>(); 951 | 952 | public static Ticket getTicket(String movieName) { 953 | if (map.containsKey(movieName)) { 954 | return map.get(movieName); 955 | } else { 956 | Ticket ticket = new MovieTicket(movieName); 957 | map.put(movieName, ticket); 958 | return ticket; 959 | } 960 | } 961 | 962 | } 963 | 964 | ``` 965 | 966 | ```java 967 | public class MovieTicket implements Ticket { 968 | 969 | private String movieName; 970 | private String price; 971 | 972 | public MovieTicket(String movieName){ 973 | this.movieName = movieName; 974 | price = "Price " + new Random().nextInt(100); 975 | } 976 | 977 | @Override 978 | 979 | public void printTicket(String time, String seat) { 980 | System.out.println("+-------------------+"); 981 | System.out.printf("| %-12s |\n", movieName); 982 | System.out.println("| |"); 983 | System.out.printf("| %-12s|\n", time); 984 | System.out.printf("| %-12s|\n", seat); 985 | System.out.printf("| %-12s|\n", price); 986 | System.out.println("| |"); 987 | System.out.println("+-------------------+"); 988 | } 989 | } 990 | 991 | ``` 992 | 993 | 994 | 995 | ### Usage : 996 | 997 | ```java 998 | MovieTicket movieTicket1 = (MovieTicket) TicketFactory.getTicket("Transformers 5"); 999 | movieTicket1.printTicket("14:00-16:30", "Seat D-5"); 1000 | MovieTicket movieTicket2 = (MovieTicket) TicketFactory.getTicket("Transformers 5"); 1001 | movieTicket2.printTicket("14:00-16:30", "Seat F-6"); 1002 | MovieTicket movieTicket3 = (MovieTicket) TicketFactory.getTicket("Transformers 5"); 1003 | movieTicket3.printTicket("18:00-22:30", "Seat A-2"); 1004 | ``` 1005 | 1006 | ### Outpu: 1007 | 1008 | ```code 1009 | +-------------------+ 1010 | | Transformers 5 | 1011 | | | 1012 | | 14:00-16:30 | 1013 | | Seat D-5 | 1014 | | Price 33 | 1015 | | | 1016 | +-------------------+ 1017 | +-------------------+ 1018 | | Transformers 5 | 1019 | | | 1020 | | 14:00-16:30 | 1021 | | Seat F-6 | 1022 | | Price 33 | 1023 | | | 1024 | +-------------------+ 1025 | +-------------------+ 1026 | | Transformers 5 | 1027 | | | 1028 | | 18:00-22:30 | 1029 | | Seat A-2 | 1030 | | Price 33 | 1031 | | | 1032 | +-------------------+ 1033 | 1034 | ``` 1035 | 1036 | 1037 | 1038 | 1039 | ## 1040 | ## Behavioral Patterns : 1041 | 1042 | >In software engineering, behavioral design patterns are design patterns that identify common communication patterns between objects and realize these patterns. By doing so, these patterns increase flexibility in carrying out this communication. 1043 | > 1044 | 1045 | 1046 | ## Template Method 1047 | Template Method is a behavioral design pattern that defines the skeleton of an algorithm in the superclass but lets subclasses override specific steps of the algorithm without changing its structure. 1048 | 1049 | ## UML : 1050 | 1051 | 1052 | 1053 | ### Example: 1054 | 1055 | ```java 1056 | public abstract class AssemblyLine { 1057 | 1058 | protected void onProduceShell() { 1059 | System.out.println("Produce Shell"); 1060 | } 1061 | 1062 | protected void onProduceComponents() { 1063 | System.out.println("Produce some components"); 1064 | } 1065 | 1066 | protected void onAssemblyComponents() { 1067 | System.out.println("Assembly Components"); 1068 | } 1069 | 1070 | protected void onTestProducts() { 1071 | System.out.println("Test Products"); 1072 | } 1073 | 1074 | protected void onProductPacking() { 1075 | System.out.println("Product Packing"); 1076 | } 1077 | 1078 | public final void product() { 1079 | System.out.println("+------Start Product------+"); 1080 | onProduceShell(); 1081 | onProduceComponents(); 1082 | onAssemblyComponents(); 1083 | onTestProducts(); 1084 | onProduceComponents(); 1085 | onProductPacking(); 1086 | System.out.println("+------Finish Product------+"); 1087 | } 1088 | 1089 | } 1090 | 1091 | ``` 1092 | 1093 | ```java 1094 | public class ComputerAssemblyLine extends AssemblyLine{ 1095 | 1096 | @Override 1097 | protected void onProduceShell() { 1098 | System.out.println("Product Aluminum housing and Liquid Crystal Display"); 1099 | } 1100 | 1101 | @Override 1102 | protected void onProduceComponents() { 1103 | System.out.println("Product Components and keyboard"); 1104 | } 1105 | 1106 | @Override 1107 | protected void onProductPacking() { 1108 | System.out.println("Pack and Mark the Apple trademark"); 1109 | } 1110 | } 1111 | ``` 1112 | 1113 | ```java 1114 | public class RadioAssemblyLine extends AssemblyLine{ 1115 | 1116 | @Override 1117 | protected void onProduceComponents() { 1118 | System.out.println("Product Radio Components and Antennas"); 1119 | } 1120 | } 1121 | 1122 | 1123 | ``` 1124 | 1125 | 1126 | 1127 | ### Usage : 1128 | 1129 | ```java 1130 | AssemblyLine assemblyLine = new ComputerAssemblyLine(); 1131 | assemblyLine.product(); 1132 | 1133 | System.out.println(); 1134 | 1135 | assemblyLine = new RadioAssemblyLine(); 1136 | assemblyLine.product(); 1137 | ``` 1138 | 1139 | ### Outpu: 1140 | 1141 | ```code 1142 | +------Start Product------+ 1143 | Product Aluminum housing and Liquid Crystal Display 1144 | Product Components and keyboard 1145 | Assembly Components 1146 | Test Products 1147 | Product Components and keyboard 1148 | Pack and Mark the Apple trademark 1149 | +------Finish Product------+ 1150 | 1151 | +------Start Product------+ 1152 | Produce Shell 1153 | Product Radio Components and Antennas 1154 | Assembly Components 1155 | Test Products 1156 | Product Radio Components and Antennas 1157 | Product Packing 1158 | +------Finish Product------+ 1159 | 1160 | ``` 1161 | 1162 | 1163 | ## Chain of Responsibility 1164 | The chain of responsibility pattern is used to process varied requests, each of which may be dealt with by a different handler. 1165 | 1166 | ## UML : 1167 | 1168 | 1169 | 1170 | ### Example: 1171 | 1172 | ```java 1173 | public abstract class Handler { 1174 | 1175 | protected Handler successor; 1176 | 1177 | public abstract int capital(); 1178 | 1179 | public abstract void handle(int money); 1180 | 1181 | public final void handleRequest(int money) { 1182 | if (money <= capital()) { 1183 | handle(money); 1184 | }else { 1185 | if (null != successor) { 1186 | successor.handleRequest(money); 1187 | }else { 1188 | System.out.println("Your requested funds could not be approved"); 1189 | } 1190 | } 1191 | } 1192 | 1193 | } 1194 | 1195 | ``` 1196 | 1197 | ```java 1198 | public class Tutor extends Handler{ 1199 | @Override 1200 | public int capital() { 1201 | return 100; 1202 | } 1203 | 1204 | @Override 1205 | public void handle(int money) { 1206 | System.out.println("Approved by the instructor: approved " + money + " Dollar"); 1207 | } 1208 | } 1209 | ``` 1210 | 1211 | ```java 1212 | public class Secretary extends Handler { 1213 | @Override 1214 | public int capital() { 1215 | return 1000; 1216 | } 1217 | 1218 | @Override 1219 | public void handle(int money) { 1220 | System.out.println("Secretary approved: approved " + money + " Dollar"); 1221 | } 1222 | } 1223 | 1224 | 1225 | ``` 1226 | 1227 | ```java 1228 | public class Principal extends Handler { 1229 | @Override 1230 | public int capital() { 1231 | return 1000; 1232 | } 1233 | 1234 | @Override 1235 | public void handle(int money) { 1236 | System.out.println("Approved by the principal: approved " + money + " Dollar"); 1237 | } 1238 | } 1239 | 1240 | 1241 | ``` 1242 | 1243 | ```java 1244 | public class Dean extends Handler { 1245 | @Override 1246 | public int capital() { 1247 | return 5000; 1248 | } 1249 | 1250 | @Override 1251 | public void handle(int money) { 1252 | System.out.println("Dean approved: approved " + money + " Dollar"); 1253 | } 1254 | } 1255 | 1256 | ``` 1257 | 1258 | 1259 | 1260 | ### Usage : 1261 | 1262 | ```java 1263 | Tutor tutor = new Tutor(); 1264 | Secretary secretary = new Secretary(); 1265 | Dean dean = new Dean(); 1266 | Principal principal = new Principal(); 1267 | 1268 | tutor.successor = secretary; 1269 | secretary.successor = dean; 1270 | dean.successor = principal; 1271 | principal.successor = null; 1272 | 1273 | tutor.handleRequest(12000); 1274 | secretary.handleRequest(100); 1275 | ``` 1276 | 1277 | ### Outpu: 1278 | 1279 | ```code 1280 | Your requested funds could not be approved 1281 | Secretary approved: approved 100 Dollar 1282 | 1283 | ``` 1284 | 1285 | 1286 | 1287 | ## Command 1288 | The command pattern is used to express a request, including the call to be made and all of its required parameters, in a command object. The command may then be executed immediately or held for later use. 1289 | 1290 | ## UML : 1291 | 1292 | 1293 | 1294 | 1295 | ### Example: 1296 | 1297 | ```java 1298 | public interface OrderCommand { 1299 | void execute(); 1300 | } 1301 | 1302 | ``` 1303 | 1304 | ```java 1305 | public class OrderPayCommand implements OrderCommand{ 1306 | 1307 | public Long id; 1308 | 1309 | public OrderPayCommand(Long id) { 1310 | this.id = id; 1311 | } 1312 | 1313 | @Override 1314 | public void execute() { 1315 | System.out.println("Paying for order with id : " + id); 1316 | } 1317 | } 1318 | 1319 | ``` 1320 | 1321 | ```java 1322 | public class OrderAddCommand implements OrderCommand{ 1323 | public Long id; 1324 | 1325 | public OrderAddCommand(Long id) { 1326 | this.id = id; 1327 | } 1328 | 1329 | @Override 1330 | public void execute() { 1331 | System.out.println("Adding Order With id : " + id); 1332 | } 1333 | } 1334 | 1335 | ``` 1336 | 1337 | ```java 1338 | public class CommandProcessor { 1339 | 1340 | ArrayList queue = new ArrayList<>(); 1341 | 1342 | public void addToQueue(OrderCommand orderCommand) { 1343 | queue.add(orderCommand); 1344 | } 1345 | 1346 | public void processCommands() { 1347 | queue.forEach(OrderCommand::execute); 1348 | queue.clear(); 1349 | } 1350 | } 1351 | 1352 | ``` 1353 | 1354 | 1355 | ### Usage : 1356 | 1357 | ```java 1358 | CommandProcessor obj = new CommandProcessor(); 1359 | obj.addToQueue(new OrderAddCommand(1L)); 1360 | obj.addToQueue(new OrderAddCommand(2L)); 1361 | obj.addToQueue(new OrderPayCommand(2L)); 1362 | obj.addToQueue(new OrderPayCommand(1L)); 1363 | obj.processCommands(); 1364 | ``` 1365 | 1366 | ### Outpu: 1367 | 1368 | ```code 1369 | Adding Order With id : 1 1370 | Adding Order With id : 2 1371 | Paying for order with id : 2 1372 | Paying for order with id : 1 1373 | 1374 | ``` 1375 | 1376 | 1377 | 1378 | ## Iterator 1379 | Iterator is a behavioral design pattern that lets you traverse elements of a collection without exposing its underlying representation (list, stack, tree, etc.). 1380 | 1381 | ## UML : 1382 | 1383 | 1384 | 1385 | 1386 | ### Example: 1387 | 1388 | ```java 1389 | public interface Iterator { 1390 | boolean hasNext(); 1391 | T next(); 1392 | } 1393 | 1394 | ``` 1395 | 1396 | ```java 1397 | public interface BookIterable { 1398 | Iterator iterator(); 1399 | } 1400 | 1401 | ``` 1402 | 1403 | ```java 1404 | public class Book { 1405 | 1406 | private String name; 1407 | private String ISBN; 1408 | private String press; 1409 | 1410 | public Book(String name, String ISBN, String press) { 1411 | this.name = name; 1412 | this.ISBN = ISBN; 1413 | this.press = press; 1414 | } 1415 | 1416 | @Override 1417 | public String toString() { 1418 | return "Book{" + 1419 | "name='" + name + '\'' + 1420 | ", ISBN='" + ISBN + '\'' + 1421 | ", press='" + press + '\'' + 1422 | '}'; 1423 | } 1424 | 1425 | /* 1426 | Don't forget geeter and setter !!!! 1427 | */ 1428 | ``` 1429 | 1430 | ```java 1431 | public class Literature implements BookIterable{ 1432 | 1433 | private Book[] literature; 1434 | 1435 | public Literature() { 1436 | literature = new Book[4]; 1437 | literature[0] = new Book("Three Kingdoms", "9787532237357", "Shanghai People's Fine Arts Publishing House"); 1438 | literature[1] = new Book("Journey to the West", "9787805200552", "Yuelu Publishing House"); 1439 | literature[2] = new Book("Water Margin", "9787020015016", "People's Literature Publishing House"); 1440 | literature[3] = new Book("Dream of Red Mansions", "9787020002207", "People's Literature Publishing House"); 1441 | } 1442 | 1443 | public Book[] getLiterature() { 1444 | return literature; 1445 | } 1446 | 1447 | @Override 1448 | public Iterator iterator() { 1449 | return new LiteratureIterator(literature); 1450 | } 1451 | } 1452 | ``` 1453 | 1454 | ```java 1455 | public class LiteratureIterator implements Iterator{ 1456 | 1457 | 1458 | private Book[] literatures; 1459 | 1460 | private int index; 1461 | 1462 | public LiteratureIterator(Book[] literatures) { 1463 | this.literatures = literatures; 1464 | } 1465 | 1466 | @Override 1467 | public boolean hasNext() { 1468 | return (index < literatures.length - 1 && literatures[index] != null); 1469 | } 1470 | 1471 | @Override 1472 | public Book next() { 1473 | return literatures[index++]; 1474 | } 1475 | } 1476 | ``` 1477 | 1478 | 1479 | 1480 | ### Usage : 1481 | 1482 | ```java 1483 | public static void main(String[] args) { 1484 | Literature literature = new Literature(); 1485 | itr(literature.iterator()); 1486 | 1487 | } 1488 | 1489 | private static void itr(Iterator iterator) { 1490 | while (iterator.hasNext()) { 1491 | System.out.println(iterator.next()); 1492 | } 1493 | } 1494 | ``` 1495 | 1496 | ### Outpu: 1497 | 1498 | ```code 1499 | Book{name='Three Kingdoms', ISBN='9787532237357', press='Shanghai People's Fine Arts Publishing House'} 1500 | Book{name='Journey to the West', ISBN='9787805200552', press='Yuelu Publishing House'} 1501 | Book{name='Water Margin', ISBN='9787020015016', press='People's Literature Publishing House'} 1502 | ``` 1503 | 1504 | 1505 | 1506 | ## Mediator 1507 | Mediator design pattern is used to provide a centralized communication medium between different objects in a system. This pattern is very helpful in an enterprise application where multiple objects are interacting with each other. 1508 | 1509 | ## UML : 1510 | 1511 | 1512 | 1513 | 1514 | ### Example: 1515 | 1516 | ```java 1517 | public interface ChatMediator { 1518 | void sendMessage(String msg, User user); 1519 | void addUser(User user); 1520 | } 1521 | 1522 | ``` 1523 | 1524 | ```java 1525 | public abstract class User { 1526 | protected ChatMediator mediator; 1527 | protected String name; 1528 | 1529 | public User(ChatMediator med, String name) { 1530 | this.mediator = med; 1531 | this.name = name; 1532 | } 1533 | 1534 | public abstract void send(String msg); 1535 | public abstract void receive(String msg); 1536 | } 1537 | 1538 | ``` 1539 | 1540 | ```java 1541 | public class ChatMediatorImpl implements ChatMediator { 1542 | private final List users; 1543 | 1544 | public ChatMediatorImpl() { this.users = new ArrayList<>(); } 1545 | 1546 | @Override 1547 | public void addUser(User user) { 1548 | this.users.add(user); 1549 | } 1550 | 1551 | @Override 1552 | public void sendMessage(String msg, User toUser) { 1553 | for (User user : users) { 1554 | //Message should not be received by the user sending it. 1555 | if(user != toUser) { user.receive(msg); } 1556 | } 1557 | } 1558 | } 1559 | ``` 1560 | 1561 | ```java 1562 | public class UserImpl extends User { 1563 | public UserImpl(ChatMediator med, String name) { 1564 | super(med, name); 1565 | } 1566 | 1567 | @Override 1568 | public void send(String msg) { 1569 | System.out.println(this.name + ": Sending Message = " + msg); 1570 | mediator.sendMessage(msg, this); 1571 | } 1572 | 1573 | @Override 1574 | public void receive(String msg) { 1575 | System.out.println(this.name + ": Message received: " + msg); 1576 | } 1577 | } 1578 | ``` 1579 | 1580 | 1581 | 1582 | ### Usage : 1583 | 1584 | ```java 1585 | ChatMediator mediator = new ChatMediatorImpl(); 1586 | User user1 = new UserImpl(mediator, "Tamer"); 1587 | User user2 = new UserImpl(mediator, "Mohab"); 1588 | User user3 = new UserImpl(mediator, "Mohand"); 1589 | User user4 = new UserImpl(mediator, "Habiba"); 1590 | 1591 | mediator.addUser(user1); 1592 | mediator.addUser(user2); 1593 | mediator.addUser(user3); 1594 | mediator.addUser(user4); 1595 | 1596 | user1.send("Hi everyone!"); 1597 | ``` 1598 | 1599 | ### Outpu: 1600 | 1601 | ```code 1602 | Mohab: Message received: Hi everyone! 1603 | Mohand: Message received: Hi everyone! 1604 | Habiba: Message received: Hi everyone! 1605 | ``` 1606 | 1607 | 1608 | 1609 | 1610 | ## Memento 1611 | The memento pattern is a software design pattern that provides the ability to restore an object to its previous state (undo via rollback). 1612 | 1613 | ## UML : 1614 | 1615 | 1616 | 1617 | 1618 | ### Example: 1619 | 1620 | ```java 1621 | public class Memento { 1622 | private String mDate; 1623 | private String mTodo; 1624 | private boolean mIsFinish; 1625 | 1626 | public void setDate(String date) { 1627 | mDate = date; 1628 | } 1629 | 1630 | public String getDate() { 1631 | return mDate; 1632 | } 1633 | 1634 | public String getTodo() { 1635 | return mTodo; 1636 | } 1637 | 1638 | public void setTodo(String mTodo) { 1639 | this.mTodo = mTodo; 1640 | } 1641 | 1642 | public boolean isFinish() { 1643 | return mIsFinish; 1644 | } 1645 | 1646 | public void setIsFinish(boolean mIsFinish) { 1647 | this.mIsFinish = mIsFinish; 1648 | } 1649 | 1650 | @Override 1651 | public String toString() { 1652 | return "memento{" + 1653 | "Date='" + mDate + '\'' + 1654 | ", Todo='" + mTodo + '\'' + 1655 | ", IsFinish=" + mIsFinish + 1656 | '}'; 1657 | } 1658 | } 1659 | 1660 | ``` 1661 | 1662 | ```java 1663 | public class Caretaker { 1664 | private Memento mMemoto; 1665 | 1666 | public void archive(Memento memoto) { 1667 | mMemoto = memoto; 1668 | } 1669 | 1670 | public Memento getMemoto() { 1671 | return mMemoto; 1672 | } 1673 | } 1674 | 1675 | ``` 1676 | 1677 | ```java 1678 | public class ToDo { 1679 | private String mDate; 1680 | private String mTodo; 1681 | private boolean mIsFinish; 1682 | 1683 | public ToDo() { 1684 | mDate = new SimpleDateFormat("yyyy/MM/dd EE HH:mm:ss").format(new Date()); 1685 | } 1686 | 1687 | public void setToDoDetail(String todo, boolean isFinish) { 1688 | mTodo = todo; 1689 | mIsFinish = isFinish; 1690 | } 1691 | 1692 | public Memento createMemoto() { 1693 | Memento memento = new Memento(); 1694 | memento.setDate(mDate); 1695 | memento.setTodo(mTodo); 1696 | memento.setIsFinish(mIsFinish); 1697 | return memento; 1698 | } 1699 | 1700 | public void restore(Memento memento) { 1701 | mDate = memento.getDate(); 1702 | mTodo = memento.getTodo(); 1703 | mIsFinish = memento.isFinish(); 1704 | } 1705 | 1706 | public String getDate() { 1707 | return mDate; 1708 | } 1709 | 1710 | public String getTodo() { 1711 | return mTodo; 1712 | } 1713 | 1714 | public void setTodo(String mTodo) { 1715 | this.mTodo = mTodo; 1716 | } 1717 | 1718 | public boolean isIsFinish() { 1719 | return mIsFinish; 1720 | } 1721 | 1722 | public void setIsFinish(boolean mIsFinish) { 1723 | this.mIsFinish = mIsFinish; 1724 | } 1725 | 1726 | @Override 1727 | public String toString() { 1728 | return "ToDo{" + 1729 | "Date='" + mDate + '\'' + 1730 | ", Todo='" + mTodo + '\'' + 1731 | ", IsFinish=" + mIsFinish + 1732 | '}'; 1733 | } 1734 | } 1735 | ``` 1736 | 1737 | 1738 | 1739 | 1740 | ### Usage : 1741 | 1742 | ```java 1743 | ToDo toDo = new ToDo(); 1744 | 1745 | toDo.setToDoDetail("Write Java at 2 pm", false); 1746 | 1747 | Caretaker caretaker = new Caretaker(); 1748 | caretaker.archive(toDo.createMemoto()); 1749 | 1750 | System.out.println(toDo.toString()); 1751 | 1752 | ToDo newToDo = new ToDo(); 1753 | newToDo.restore(caretaker.getMemoto()); 1754 | newToDo.setIsFinish(true); 1755 | 1756 | System.out.println(newToDo.toString()); 1757 | ``` 1758 | 1759 | ### Outpu: 1760 | 1761 | ```code 1762 | ToDo{Date='2021/11/06 Sat 16:04:55', Todo='Write Java at 2 pm', IsFinish=false} 1763 | ToDo{Date='2021/11/06 Sat 16:04:55', Todo='Write Java at 2 pm', IsFinish=true} 1764 | ``` 1765 | 1766 | 1767 | 1768 | 1769 | ## Observer 1770 | The observer pattern is used to allow an object to publish changes to its state. Other objects subscribe to be immediately notified of any changes. 1771 | 1772 | ## UML : 1773 | 1774 | 1775 | 1776 | 1777 | ### Example: 1778 | 1779 | ```java 1780 | public interface Observer { 1781 | public void update(String magazine); 1782 | } 1783 | 1784 | ``` 1785 | 1786 | ```java 1787 | public interface Subject { 1788 | void registerObserver(Observer observer); 1789 | void removeObserver(Observer observer); 1790 | void notifyObservers(); 1791 | } 1792 | 1793 | ``` 1794 | 1795 | ```java 1796 | public class Magazine implements Subject{ 1797 | private List observerList; 1798 | private String magazine; 1799 | 1800 | public Magazine() { 1801 | observerList = new ArrayList<>(); 1802 | } 1803 | 1804 | @Override 1805 | public void registerObserver(Observer observer) { 1806 | observerList.add(observer); 1807 | } 1808 | 1809 | @Override 1810 | public void removeObserver(Observer observer) { 1811 | observerList.remove(observer); 1812 | } 1813 | 1814 | @Override 1815 | public void notifyObservers() { 1816 | for (int i = 0; i < observerList.size(); i++) { 1817 | Observer observer= observerList.get(i); 1818 | observer.update(magazine); 1819 | } 1820 | } 1821 | 1822 | public void setMagazine(String magazine) { 1823 | this.magazine = magazine; 1824 | notifyObservers(); 1825 | } 1826 | 1827 | } 1828 | 1829 | ``` 1830 | 1831 | ```java 1832 | public class Subscriber implements Observer { 1833 | 1834 | private final String subscriber; 1835 | 1836 | public Subscriber(Subject magazine, String subscriber) { 1837 | magazine.registerObserver(this); 1838 | this.subscriber = subscriber; 1839 | } 1840 | 1841 | @Override 1842 | public void update(String magazine) { 1843 | System.out.println("Dear" + subscriber + ": Your magazine has arrived, and today’s magazine is called《" + magazine +"》"); 1844 | } 1845 | } 1846 | ``` 1847 | 1848 | ```java 1849 | public class Bookstore implements Observer{ 1850 | public Bookstore(Subject magazine) { 1851 | magazine.registerObserver(this); 1852 | } 1853 | 1854 | @Override 1855 | public void update(String magazine) { 1856 | System.out.println("Our shop updates the magazine today:《" + magazine+ "》"); 1857 | } 1858 | } 1859 | ``` 1860 | 1861 | 1862 | 1863 | ### Usage : 1864 | 1865 | ```java 1866 | Magazine magazine = new Magazine(); 1867 | 1868 | Subscriber mohamed = new Subscriber(magazine, "Mohamed"); 1869 | Subscriber tamer = new Subscriber(magazine, "Tamer"); 1870 | Subscriber habiba = new Subscriber(magazine, "Habiba"); 1871 | Bookstore bookstore = new Bookstore(magazine); 1872 | 1873 | magazine.setMagazine("Shock! Today's magazine since..."); 1874 | ``` 1875 | 1876 | ### Outpu: 1877 | 1878 | ```code 1879 | DearMohamed: Your magazine has arrived, and today’s magazine is called《Shock! Today's magazine since...》 1880 | DearTamer: Your magazine has arrived, and today’s magazine is called《Shock! Today's magazine since...》 1881 | DearHabiba: Your magazine has arrived, and today’s magazine is called《Shock! Today's magazine since...》 1882 | Our shop updates the magazine today:《Shock! Today's magazine since...》 1883 | ``` 1884 | 1885 | 1886 | 1887 | 1888 | ## State 1889 | The state pattern is used to alter the behaviour of an object as its internal state changes. The pattern allows the class for an object to apparently change at run-time. 1890 | 1891 | ## UML : 1892 | 1893 | 1894 | 1895 | 1896 | ### Example: 1897 | 1898 | ```java 1899 | public interface GameState { 1900 | void killMonster(); 1901 | void gainExperience(); 1902 | void next(); 1903 | void pick(); 1904 | } 1905 | 1906 | ``` 1907 | 1908 | ```java 1909 | public class Player { 1910 | 1911 | GameState state; 1912 | 1913 | public void setState(GameState state) { 1914 | this.state = state; 1915 | } 1916 | 1917 | public void gameStart() { 1918 | setState(new GameStartState()); 1919 | System.out.println("\n-----Game Start, ready to fight-----\n"); 1920 | } 1921 | 1922 | public void gameOver() { 1923 | setState(new GameOverState()); 1924 | System.out.println("\n----- Game Over -----\n"); 1925 | } 1926 | 1927 | public void killMonster() { 1928 | state.killMonster(); 1929 | } 1930 | 1931 | public void gainExperience() { 1932 | state.gainExperience(); 1933 | } 1934 | 1935 | public void next() { 1936 | state.next(); 1937 | } 1938 | 1939 | public void pick() { 1940 | state.pick(); 1941 | } 1942 | 1943 | } 1944 | 1945 | ``` 1946 | 1947 | ```java 1948 | public class GameStartState implements GameState { 1949 | 1950 | @Override 1951 | public void killMonster() { 1952 | System.out.println("Kill a Monster"); 1953 | } 1954 | 1955 | @Override 1956 | public void gainExperience() { 1957 | System.out.println("Gain 5 EXP"); 1958 | } 1959 | 1960 | @Override 1961 | public void next() { 1962 | System.out.println("Good! please enter next level"); 1963 | } 1964 | 1965 | @Override 1966 | public void pick() { 1967 | System.out.println("Wow! You pick a good thing"); 1968 | } 1969 | } 1970 | 1971 | ``` 1972 | 1973 | ```java 1974 | public class GameOverState implements GameState { 1975 | 1976 | @Override 1977 | public void killMonster() { 1978 | System.out.println("Please start game first"); 1979 | } 1980 | 1981 | @Override 1982 | public void gainExperience() {} 1983 | 1984 | @Override 1985 | public void next() { 1986 | System.out.println("You want to challenge again?"); 1987 | } 1988 | 1989 | @Override 1990 | public void pick() { 1991 | System.out.println("Please start game first"); 1992 | } 1993 | } 1994 | ``` 1995 | 1996 | 1997 | 1998 | ### Usage : 1999 | 2000 | ```java 2001 | Player player = new Player(); 2002 | player.gameStart(); 2003 | player.killMonster(); 2004 | player.gainExperience(); 2005 | player.next(); 2006 | player.pick(); 2007 | player.gameOver(); 2008 | player.next(); 2009 | player.killMonster(); 2010 | player.pick(); 2011 | ``` 2012 | 2013 | ### Outpu: 2014 | 2015 | ```code 2016 | -----Game Start, ready to fight----- 2017 | 2018 | Kill a Monster 2019 | Gain 5 EXP 2020 | Good! please enter next level 2021 | Wow! You pick a good thing 2022 | 2023 | ----- Game Over ----- 2024 | 2025 | You want to challenge again? 2026 | Please start game first 2027 | Please start game first 2028 | 2029 | ``` 2030 | 2031 | 2032 | 2033 | 2034 | ## Strategy 2035 | The strategy pattern is used to create an interchangeable family of algorithms from which the required process is chosen at run-time. 2036 | 2037 | ## UML : 2038 | 2039 | 2040 | 2041 | 2042 | ### Example: 2043 | 2044 | ```java 2045 | public interface Strategy { 2046 | void transportation(); 2047 | } 2048 | ``` 2049 | 2050 | ```java 2051 | public class Context { 2052 | private Strategy goToStrategy; 2053 | 2054 | public void setGoToStrategy(Strategy strategy) { 2055 | this.goToStrategy = strategy; 2056 | } 2057 | 2058 | public void take() { 2059 | goToStrategy.transportation(); 2060 | } 2061 | } 2062 | 2063 | ``` 2064 | 2065 | ```java 2066 | public class GoToCairo implements Strategy{ 2067 | @Override 2068 | public void transportation() { 2069 | System.out.println("take my car"); 2070 | } 2071 | } 2072 | ``` 2073 | 2074 | ```java 2075 | public class GoToGona implements Strategy{ 2076 | @Override 2077 | public void transportation() { 2078 | System.out.println("take plane"); 2079 | } 2080 | } 2081 | ``` 2082 | 2083 | 2084 | 2085 | ### Usage : 2086 | 2087 | ```java 2088 | Context context = new Context(); 2089 | 2090 | context.setGoToStrategy(new GoToCairo()); 2091 | context.take(); 2092 | 2093 | context.setGoToStrategy(new GoToGona()); 2094 | context.take(); 2095 | ``` 2096 | 2097 | ### Outpu: 2098 | 2099 | ```code 2100 | take my car 2101 | take plane 2102 | 2103 | ``` 2104 | 2105 | 2106 | 2107 | 2108 | ## Visitor 2109 | The visitor pattern is used to separate a relatively complex set of structured data classes from the functionality that may be performed upon the data that they hold. 2110 | 2111 | ## UML : 2112 | 2113 | 2114 | 2115 | 2116 | ### Example: 2117 | 2118 | ```java 2119 | public interface Interviewer { 2120 | void visit(Student student); 2121 | void visit(Engineer engineer); 2122 | } 2123 | 2124 | ``` 2125 | 2126 | ```java 2127 | public interface Applicant { 2128 | void accept(Interviewer visitor); 2129 | } 2130 | ``` 2131 | 2132 | ```java 2133 | public class Engineer implements Applicant { 2134 | 2135 | private String name; 2136 | private int workExperience; 2137 | private int projectNumber; 2138 | 2139 | public Engineer(String name, int workExperience, int projectNumber) { 2140 | this.name = name; 2141 | this.workExperience = workExperience; 2142 | this.projectNumber = projectNumber; 2143 | } 2144 | 2145 | @Override 2146 | public void accept(Interviewer visitor) { 2147 | visitor.visit(this); 2148 | } 2149 | 2150 | public String getName() { 2151 | return name; 2152 | } 2153 | 2154 | public void setName(String name) { 2155 | this.name = name; 2156 | } 2157 | 2158 | public int getWorkExperience() { 2159 | return workExperience; 2160 | } 2161 | 2162 | public void setWorkExperience(int workExperience) { 2163 | this.workExperience = workExperience; 2164 | } 2165 | 2166 | public int getProjectNumber() { 2167 | return projectNumber; 2168 | } 2169 | 2170 | public void setProjectNumber(int projectNumber) { 2171 | this.projectNumber = projectNumber; 2172 | } 2173 | } 2174 | ``` 2175 | 2176 | ```java 2177 | public class Student implements Applicant{ 2178 | private String name; 2179 | private double gpa; 2180 | private String major; 2181 | 2182 | public Student(String name, double gpa, String major) { 2183 | this.name = name; 2184 | this.gpa = gpa; 2185 | this.major = major; 2186 | } 2187 | 2188 | @Override 2189 | public void accept(Interviewer visitor) { 2190 | visitor.visit(this); 2191 | } 2192 | 2193 | public String getName() { 2194 | return name; 2195 | } 2196 | 2197 | public void setName(String name) { 2198 | this.name = name; 2199 | } 2200 | 2201 | 2202 | public double getGpa() { 2203 | return gpa; 2204 | } 2205 | 2206 | public void setGpa(double gpa) { 2207 | this.gpa = gpa; 2208 | } 2209 | 2210 | public String getMajor() { 2211 | return major; 2212 | } 2213 | 2214 | public void setMajor(String major) { 2215 | this.major = major; 2216 | } 2217 | } 2218 | ``` 2219 | 2220 | ```java 2221 | public class Leader implements Interviewer { 2222 | @Override 2223 | public void visit(Student student) { 2224 | System.out.println("Student " + student.getName() + "'s gpa is " + student.getGpa()); 2225 | } 2226 | 2227 | @Override 2228 | public void visit(Engineer engineer) { 2229 | System.out.println("Engineer " + engineer.getName() + "'s number of projects is " + engineer.getProjectNumber()); 2230 | } 2231 | } 2232 | ``` 2233 | 2234 | ```java 2235 | public class LaborMarket { 2236 | 2237 | List applicants = new ArrayList<>(); 2238 | 2239 | { 2240 | applicants.add(new Student("Tamer", 3.2, "Computer Science")); 2241 | applicants.add(new Student("Mohamed", 3.4, "Network Engineer")); 2242 | applicants.add(new Student("Habiba", 3.4, "Computer Science")); 2243 | applicants.add(new Engineer("Ahmed", 4, 15)); 2244 | applicants.add(new Engineer("Mohand", 3, 10)); 2245 | applicants.add(new Engineer("Mohab", 6, 20)); 2246 | } 2247 | 2248 | 2249 | public void showApplicants(Interviewer visitor) { 2250 | for (Applicant applicant : applicants) { 2251 | applicant.accept(visitor); 2252 | } 2253 | } 2254 | } 2255 | 2256 | ``` 2257 | 2258 | 2259 | 2260 | ### Usage : 2261 | 2262 | ```java 2263 | LaborMarket laborMarket = new LaborMarket(); 2264 | System.out.println("===== Round 1: Leader ====="); 2265 | laborMarket.showApplicants(new Leader()); 2266 | 2267 | /* 2268 | You can add more rounds and implements ............. 2269 | */ 2270 | ``` 2271 | 2272 | ### Outpu: 2273 | 2274 | ```code 2275 | ===== Round 1: Leader ===== 2276 | Student Tamer's gpa is 3.2 2277 | Student Mohamed's gpa is 3.4 2278 | Student Habiba's gpa is 3.4 2279 | Engineer Ahmed's number of projects is 15 2280 | Engineer Mohand's number of projects is 10 2281 | Engineer Mohab's number of projects is 20 2282 | 2283 | ``` 2284 | 2285 | 2286 | 2287 | 2288 | 2289 | 2290 | 2291 | 2292 | 2293 | 2294 | 2295 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/chain_of_responsibility/Client.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.chain_of_responsibility; 2 | 3 | public class Client { 4 | public static void main(String[] args) { 5 | 6 | Tutor tutor = new Tutor(); 7 | Secretary secretary = new Secretary(); 8 | Dean dean = new Dean(); 9 | Principal principal = new Principal(); 10 | 11 | tutor.successor = secretary; 12 | secretary.successor = dean; 13 | dean.successor = principal; 14 | principal.successor = null; 15 | 16 | tutor.handleRequest(12000); 17 | secretary.handleRequest(100); 18 | 19 | 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/chain_of_responsibility/Dean.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.chain_of_responsibility; 2 | 3 | public class Dean extends Handler { 4 | @Override 5 | public int capital() { 6 | return 5000; 7 | } 8 | 9 | @Override 10 | public void handle(int money) { 11 | System.out.println("Dean approved: approved " + money + " Dollar"); 12 | } 13 | } -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/chain_of_responsibility/Handler.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.chain_of_responsibility; 2 | 3 | public abstract class Handler { 4 | 5 | protected Handler successor; 6 | 7 | public abstract int capital(); 8 | 9 | public abstract void handle(int money); 10 | 11 | public final void handleRequest(int money) { 12 | if (money <= capital()) { 13 | handle(money); 14 | }else { 15 | if (null != successor) { 16 | successor.handleRequest(money); 17 | }else { 18 | System.out.println("Your requested funds could not be approved"); 19 | } 20 | } 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/chain_of_responsibility/Principal.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.chain_of_responsibility; 2 | 3 | public class Principal extends Handler { 4 | @Override 5 | public int capital() { 6 | return 1000; 7 | } 8 | 9 | @Override 10 | public void handle(int money) { 11 | System.out.println("Approved by the principal: approved " + money + " Dollar"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/chain_of_responsibility/Secretary.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.chain_of_responsibility; 2 | 3 | public class Secretary extends Handler { 4 | @Override 5 | public int capital() { 6 | return 1000; 7 | } 8 | 9 | @Override 10 | public void handle(int money) { 11 | System.out.println("Secretary approved: approved " + money + " Dollar"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/chain_of_responsibility/Tutor.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.chain_of_responsibility; 2 | 3 | public class Tutor extends Handler{ 4 | @Override 5 | public int capital() { 6 | return 100; 7 | } 8 | 9 | @Override 10 | public void handle(int money) { 11 | System.out.println("Approved by the instructor: approved " + money + " Dollar"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/commandpatterns/Client.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.commandpatterns; 2 | 3 | public class Client { 4 | public static void main(String[] args) { 5 | CommandProcessor obj = new CommandProcessor(); 6 | obj.addToQueue(new OrderAddCommand(1L)); 7 | obj.addToQueue(new OrderAddCommand(2L)); 8 | obj.addToQueue(new OrderPayCommand(2L)); 9 | obj.addToQueue(new OrderPayCommand(1L)); 10 | obj.processCommands(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/commandpatterns/CommandProcessor.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.commandpatterns; 2 | 3 | import java.util.ArrayList; 4 | 5 | public class CommandProcessor { 6 | 7 | ArrayList queue = new ArrayList<>(); 8 | 9 | public void addToQueue(OrderCommand orderCommand) { 10 | queue.add(orderCommand); 11 | } 12 | 13 | public void processCommands() { 14 | queue.forEach(OrderCommand::execute); 15 | queue.clear(); 16 | } 17 | 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/commandpatterns/OrderAddCommand.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.commandpatterns; 2 | 3 | public class OrderAddCommand implements OrderCommand{ 4 | public Long id; 5 | 6 | public OrderAddCommand(Long id) { 7 | this.id = id; 8 | } 9 | 10 | @Override 11 | public void execute() { 12 | System.out.println("Adding Order With id : " + id); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/commandpatterns/OrderCommand.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.commandpatterns; 2 | 3 | public interface OrderCommand { 4 | void execute(); 5 | } 6 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/commandpatterns/OrderPayCommand.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.commandpatterns; 2 | 3 | public class OrderPayCommand implements OrderCommand{ 4 | 5 | public Long id; 6 | 7 | public OrderPayCommand(Long id) { 8 | this.id = id; 9 | } 10 | 11 | @Override 12 | public void execute() { 13 | System.out.println("Paying for order with id : " + id); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/iterator/Book.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.iterator; 2 | 3 | public class Book { 4 | 5 | private String name; 6 | private String ISBN; 7 | private String press; 8 | 9 | public Book(String name, String ISBN, String press) { 10 | this.name = name; 11 | this.ISBN = ISBN; 12 | this.press = press; 13 | } 14 | 15 | @Override 16 | public String toString() { 17 | return "Book{" + 18 | "name='" + name + '\'' + 19 | ", ISBN='" + ISBN + '\'' + 20 | ", press='" + press + '\'' + 21 | '}'; 22 | } 23 | 24 | public String getName() { 25 | return name; 26 | } 27 | 28 | public void setName(String name) { 29 | this.name = name; 30 | } 31 | 32 | public String getISBN() { 33 | return ISBN; 34 | } 35 | 36 | public void setISBN(String ISBN) { 37 | this.ISBN = ISBN; 38 | } 39 | 40 | public String getPress() { 41 | return press; 42 | } 43 | 44 | public void setPress(String press) { 45 | this.press = press; 46 | } 47 | } -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/iterator/BookIterable.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.iterator; 2 | 3 | public interface BookIterable { 4 | 5 | Iterator iterator(); 6 | 7 | } -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/iterator/Client.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.iterator; 2 | 3 | public class Client { 4 | public static void main(String[] args) { 5 | Literature literature = new Literature(); 6 | itr(literature.iterator()); 7 | 8 | 9 | } 10 | 11 | private static void itr(Iterator iterator) { 12 | while (iterator.hasNext()) { 13 | System.out.println(iterator.next()); 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/iterator/Iterator.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.iterator; 2 | 3 | public interface Iterator { 4 | 5 | boolean hasNext(); 6 | 7 | T next(); 8 | 9 | } -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/iterator/Literature.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.iterator; 2 | 3 | public class Literature implements BookIterable{ 4 | 5 | private Book[] literature; 6 | 7 | public Literature() { 8 | literature = new Book[4]; 9 | literature[0] = new Book("Three Kingdoms", "9787532237357", "Shanghai People's Fine Arts Publishing House"); 10 | literature[1] = new Book("Journey to the West", "9787805200552", "Yuelu Publishing House"); 11 | literature[2] = new Book("Water Margin", "9787020015016", "People's Literature Publishing House"); 12 | literature[3] = new Book("Dream of Red Mansions", "9787020002207", "People's Literature Publishing House"); 13 | } 14 | 15 | public Book[] getLiterature() { 16 | return literature; 17 | } 18 | 19 | @Override 20 | public Iterator iterator() { 21 | return new LiteratureIterator(literature); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/iterator/LiteratureIterator.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.iterator; 2 | 3 | public class LiteratureIterator implements Iterator{ 4 | 5 | 6 | private Book[] literatures; 7 | 8 | private int index; 9 | 10 | public LiteratureIterator(Book[] literatures) { 11 | this.literatures = literatures; 12 | } 13 | 14 | @Override 15 | public boolean hasNext() { 16 | return (index < literatures.length - 1 && literatures[index] != null); 17 | } 18 | 19 | @Override 20 | public Book next() { 21 | return literatures[index++]; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/mediator/ChatMediator.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.mediator; 2 | 3 | 4 | 5 | public interface ChatMediator { 6 | void sendMessage(String msg, User user); 7 | void addUser(User user); 8 | } 9 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/mediator/ChatMediatorImpl.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.mediator; 2 | 3 | 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | 7 | public class ChatMediatorImpl implements ChatMediator { 8 | private final List users; 9 | 10 | public ChatMediatorImpl() { this.users = new ArrayList<>(); } 11 | 12 | @Override 13 | public void addUser(User user) { 14 | this.users.add(user); 15 | } 16 | 17 | @Override 18 | public void sendMessage(String msg, User toUser) { 19 | for (User user : users) { 20 | //Message should not be received by the user sending it. 21 | if(user != toUser) { user.receive(msg); } 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/mediator/Client.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.mediator; 2 | 3 | public class Client { 4 | public static void main(String[] args) { 5 | ChatMediator mediator = new ChatMediatorImpl(); 6 | 7 | User user1 = new UserImpl(mediator, "Tamer"); 8 | User user2 = new UserImpl(mediator, "Mohab"); 9 | User user3 = new UserImpl(mediator, "Mohand"); 10 | User user4 = new UserImpl(mediator, "Habiba"); 11 | 12 | mediator.addUser(user1); 13 | mediator.addUser(user2); 14 | mediator.addUser(user3); 15 | mediator.addUser(user4); 16 | 17 | user1.send("Hi everyone!"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/mediator/User.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.mediator; 2 | 3 | 4 | public abstract class User { 5 | protected ChatMediator mediator; 6 | protected String name; 7 | 8 | public User(ChatMediator med, String name) { 9 | this.mediator = med; 10 | this.name = name; 11 | } 12 | 13 | public abstract void send(String msg); 14 | public abstract void receive(String msg); 15 | } -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/mediator/UserImpl.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.mediator; 2 | 3 | 4 | public class UserImpl extends User { 5 | public UserImpl(ChatMediator med, String name) { 6 | super(med, name); 7 | } 8 | 9 | @Override 10 | public void send(String msg) { 11 | System.out.println(this.name + ": Sending Message = " + msg); 12 | mediator.sendMessage(msg, this); 13 | } 14 | 15 | @Override 16 | public void receive(String msg) { 17 | System.out.println(this.name + ": Message received: " + msg); 18 | } 19 | } -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/memento/Caretaker.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.memento; 2 | 3 | public class Caretaker { 4 | private Memento mMemoto; 5 | 6 | public void archive(Memento memoto) { 7 | mMemoto = memoto; 8 | } 9 | 10 | public Memento getMemoto() { 11 | return mMemoto; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/memento/Client.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.memento; 2 | 3 | public class Client { 4 | public static void main(String[] args) { 5 | ToDo toDo = new ToDo(); 6 | 7 | toDo.setToDoDetail("Write Java at 2 pm", false); 8 | 9 | Caretaker caretaker = new Caretaker(); 10 | caretaker.archive(toDo.createMemoto()); 11 | 12 | System.out.println(toDo.toString()); 13 | 14 | ToDo newToDo = new ToDo(); 15 | newToDo.restore(caretaker.getMemoto()); 16 | newToDo.setIsFinish(true); 17 | 18 | System.out.println(newToDo.toString()); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/memento/Memento.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.memento; 2 | 3 | public class Memento { 4 | private String mDate; 5 | private String mTodo; 6 | private boolean mIsFinish; 7 | 8 | public void setDate(String date) { 9 | mDate = date; 10 | } 11 | 12 | public String getDate() { 13 | return mDate; 14 | } 15 | 16 | public String getTodo() { 17 | return mTodo; 18 | } 19 | 20 | public void setTodo(String mTodo) { 21 | this.mTodo = mTodo; 22 | } 23 | 24 | public boolean isFinish() { 25 | return mIsFinish; 26 | } 27 | 28 | public void setIsFinish(boolean mIsFinish) { 29 | this.mIsFinish = mIsFinish; 30 | } 31 | 32 | @Override 33 | public String toString() { 34 | return "memento{" + 35 | "Date='" + mDate + '\'' + 36 | ", Todo='" + mTodo + '\'' + 37 | ", IsFinish=" + mIsFinish + 38 | '}'; 39 | } 40 | } -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/memento/ToDo.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.memento; 2 | 3 | import java.text.SimpleDateFormat; 4 | import java.util.Date; 5 | 6 | public class ToDo { 7 | private String mDate; 8 | private String mTodo; 9 | private boolean mIsFinish; 10 | 11 | public ToDo() { 12 | mDate = new SimpleDateFormat("yyyy/MM/dd EE HH:mm:ss").format(new Date()); 13 | } 14 | 15 | public void setToDoDetail(String todo, boolean isFinish) { 16 | mTodo = todo; 17 | mIsFinish = isFinish; 18 | } 19 | 20 | public Memento createMemoto() { 21 | Memento memento = new Memento(); 22 | memento.setDate(mDate); 23 | memento.setTodo(mTodo); 24 | memento.setIsFinish(mIsFinish); 25 | return memento; 26 | } 27 | 28 | public void restore(Memento memento) { 29 | mDate = memento.getDate(); 30 | mTodo = memento.getTodo(); 31 | mIsFinish = memento.isFinish(); 32 | } 33 | 34 | public String getDate() { 35 | return mDate; 36 | } 37 | 38 | public String getTodo() { 39 | return mTodo; 40 | } 41 | 42 | public void setTodo(String mTodo) { 43 | this.mTodo = mTodo; 44 | } 45 | 46 | public boolean isIsFinish() { 47 | return mIsFinish; 48 | } 49 | 50 | public void setIsFinish(boolean mIsFinish) { 51 | this.mIsFinish = mIsFinish; 52 | } 53 | 54 | @Override 55 | public String toString() { 56 | return "ToDo{" + 57 | "Date='" + mDate + '\'' + 58 | ", Todo='" + mTodo + '\'' + 59 | ", IsFinish=" + mIsFinish + 60 | '}'; 61 | } 62 | } -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/observer/Bookstore.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.observer; 2 | 3 | public class Bookstore implements Observer{ 4 | 5 | public Bookstore(Subject magazine) { 6 | magazine.registerObserver(this); 7 | } 8 | 9 | @Override 10 | public void update(String magazine) { 11 | System.out.println("Our shop updates the magazine today:《" + magazine+ "》"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/observer/Client.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.observer; 2 | 3 | public class Client { 4 | public static void main(String[] args) { 5 | Magazine magazine = new Magazine(); 6 | 7 | Subscriber mohamed = new Subscriber(magazine, "Mohamed"); 8 | Subscriber tamer = new Subscriber(magazine, "Tamer"); 9 | Subscriber habiba = new Subscriber(magazine, "Habiba"); 10 | Bookstore bookstore = new Bookstore(magazine); 11 | 12 | magazine.setMagazine("Shock! Today's magazine since..."); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/observer/Magazine.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.observer; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class Magazine implements Subject{ 7 | private List observerList; 8 | private String magazine; 9 | 10 | public Magazine() { 11 | observerList = new ArrayList<>(); 12 | } 13 | 14 | @Override 15 | public void registerObserver(Observer observer) { 16 | observerList.add(observer); 17 | } 18 | 19 | @Override 20 | public void removeObserver(Observer observer) { 21 | observerList.remove(observer); 22 | } 23 | 24 | @Override 25 | public void notifyObservers() { 26 | for (int i = 0; i < observerList.size(); i++) { 27 | Observer observer= observerList.get(i); 28 | observer.update(magazine); 29 | } 30 | } 31 | 32 | 33 | public void setMagazine(String magazine) { 34 | this.magazine = magazine; 35 | notifyObservers(); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/observer/Observer.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.observer; 2 | 3 | public interface Observer { 4 | public void update(String magazine); 5 | } 6 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/observer/Subject.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.observer; 2 | 3 | public interface Subject { 4 | 5 | void registerObserver(Observer observer); 6 | void removeObserver(Observer observer); 7 | void notifyObservers(); 8 | 9 | } 10 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/observer/Subscriber.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.observer; 2 | 3 | public class Subscriber implements Observer { 4 | 5 | private final String subscriber; 6 | 7 | public Subscriber(Subject magazine, String subscriber) { 8 | magazine.registerObserver(this); 9 | this.subscriber = subscriber; 10 | } 11 | 12 | @Override 13 | public void update(String magazine) { 14 | System.out.println("Dear" + subscriber + ": Your magazine has arrived, and today’s magazine is called《" + magazine +"》"); 15 | } 16 | } -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/state/Client.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.state; 2 | 3 | public class Client { 4 | public static void main(String[] args) { 5 | Player player = new Player(); 6 | player.gameStart(); 7 | player.killMonster(); 8 | player.gainExperience(); 9 | player.next(); 10 | player.pick(); 11 | player.gameOver(); 12 | player.next(); 13 | player.killMonster(); 14 | player.pick(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/state/GameOverState.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.state; 2 | 3 | public class GameOverState implements GameState { 4 | 5 | @Override 6 | public void killMonster() { 7 | System.out.println("Please start game first"); 8 | } 9 | 10 | @Override 11 | public void gainExperience() { 12 | 13 | } 14 | 15 | @Override 16 | public void next() { 17 | System.out.println("You want to challenge again?"); 18 | } 19 | 20 | @Override 21 | public void pick() { 22 | System.out.println("Please start game first"); 23 | } 24 | } -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/state/GameStartState.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.state; 2 | 3 | public class GameStartState implements GameState { 4 | 5 | @Override 6 | public void killMonster() { 7 | System.out.println("Kill a Monster"); 8 | } 9 | 10 | 11 | @Override 12 | public void gainExperience() { 13 | System.out.println("Gain 5 EXP"); 14 | } 15 | 16 | 17 | @Override 18 | public void next() { 19 | System.out.println("Good! please enter next level"); 20 | } 21 | 22 | 23 | @Override 24 | public void pick() { 25 | System.out.println("Wow! You pick a good thing"); 26 | } 27 | } -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/state/GameState.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.state; 2 | 3 | public interface GameState { 4 | void killMonster(); 5 | 6 | void gainExperience(); 7 | 8 | void next(); 9 | 10 | void pick(); 11 | } 12 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/state/Player.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.state; 2 | 3 | public class Player { 4 | 5 | GameState state; 6 | 7 | public void setState(GameState state) { 8 | this.state = state; 9 | } 10 | 11 | public void gameStart() { 12 | setState(new GameStartState()); 13 | System.out.println("\n-----Game Start, ready to fight-----\n"); 14 | } 15 | 16 | public void gameOver() { 17 | setState(new GameOverState()); 18 | System.out.println("\n----- Game Over -----\n"); 19 | } 20 | 21 | public void killMonster() { 22 | state.killMonster(); 23 | } 24 | 25 | public void gainExperience() { 26 | state.gainExperience(); 27 | } 28 | 29 | public void next() { 30 | state.next(); 31 | } 32 | 33 | public void pick() { 34 | state.pick(); 35 | } 36 | 37 | 38 | } -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/strategy/Client.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.strategy; 2 | 3 | public class Client { 4 | public static void main(String[] args) { 5 | Context context = new Context(); 6 | 7 | context.setGoToStrategy(new GoToCairo()); 8 | context.take(); 9 | 10 | context.setGoToStrategy(new GoToGona()); 11 | context.take(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/strategy/Context.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.strategy; 2 | 3 | public class Context { 4 | private Strategy goToStrategy; 5 | 6 | public void setGoToStrategy(Strategy strategy) { 7 | this.goToStrategy = strategy; 8 | } 9 | 10 | public void take() { 11 | goToStrategy.transportation(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/strategy/GoToCairo.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.strategy; 2 | 3 | public class GoToCairo implements Strategy{ 4 | @Override 5 | public void transportation() { 6 | System.out.println("take my car"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/strategy/GoToGona.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.strategy; 2 | 3 | public class GoToGona implements Strategy{ 4 | @Override 5 | public void transportation() { 6 | System.out.println("take plane"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/strategy/Strategy.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.strategy; 2 | 3 | public interface Strategy { 4 | void transportation(); 5 | } 6 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/template_method/AssemblyLine.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.template_method; 2 | 3 | public abstract class AssemblyLine { 4 | 5 | 6 | protected void onProduceShell() { 7 | System.out.println("Produce Shell"); 8 | } 9 | 10 | protected void onProduceComponents() { 11 | System.out.println("Produce some components"); 12 | } 13 | 14 | protected void onAssemblyComponents() { 15 | System.out.println("Assembly Components"); 16 | } 17 | 18 | protected void onTestProducts() { 19 | System.out.println("Test Products"); 20 | } 21 | 22 | protected void onProductPacking() { 23 | System.out.println("Product Packing"); 24 | } 25 | 26 | public final void product() { 27 | System.out.println("+------Start Product------+"); 28 | onProduceShell(); 29 | onProduceComponents(); 30 | onAssemblyComponents(); 31 | onTestProducts(); 32 | onProduceComponents(); 33 | onProductPacking(); 34 | System.out.println("+------Finish Product------+"); 35 | } 36 | 37 | } 38 | 39 | 40 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/template_method/Client.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.template_method; 2 | 3 | public class Client { 4 | public static void main(String[] args) { 5 | AssemblyLine assemblyLine = new ComputerAssemblyLine(); 6 | assemblyLine.product(); 7 | 8 | System.out.println(); 9 | 10 | assemblyLine = new RadioAssemblyLine(); 11 | assemblyLine.product(); 12 | 13 | 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/template_method/ComputerAssemblyLine.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.template_method; 2 | 3 | public class ComputerAssemblyLine extends AssemblyLine{ 4 | 5 | @Override 6 | protected void onProduceShell() { 7 | System.out.println("Product Aluminum housing and Liquid Crystal Display"); 8 | } 9 | 10 | @Override 11 | protected void onProduceComponents() { 12 | System.out.println("Product Components and keyboard"); 13 | } 14 | 15 | @Override 16 | protected void onProductPacking() { 17 | System.out.println("Pack and Mark the Apple trademark"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/template_method/RadioAssemblyLine.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.template_method; 2 | 3 | public class RadioAssemblyLine extends AssemblyLine{ 4 | 5 | @Override 6 | protected void onProduceComponents() { 7 | System.out.println("Product Radio Components and Antennas"); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/visitor/Applicant.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.visitor; 2 | 3 | public interface Applicant { 4 | void accept(Interviewer visitor); 5 | } 6 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/visitor/Client.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.visitor; 2 | 3 | public class Client { 4 | public static void main(String[] args) { 5 | LaborMarket laborMarket = new LaborMarket(); 6 | System.out.println("===== Round 1: Leader ====="); 7 | laborMarket.showApplicants(new Leader()); 8 | 9 | /* 10 | You can add more rounds and implements ............. 11 | */ 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/visitor/Engineer.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.visitor; 2 | 3 | public class Engineer implements Applicant { 4 | 5 | private String name; 6 | private int workExperience; 7 | private int projectNumber; 8 | 9 | public Engineer(String name, int workExperience, int projectNumber) { 10 | this.name = name; 11 | this.workExperience = workExperience; 12 | this.projectNumber = projectNumber; 13 | } 14 | 15 | @Override 16 | public void accept(Interviewer visitor) { 17 | visitor.visit(this); 18 | } 19 | 20 | public String getName() { 21 | return name; 22 | } 23 | 24 | public void setName(String name) { 25 | this.name = name; 26 | } 27 | 28 | public int getWorkExperience() { 29 | return workExperience; 30 | } 31 | 32 | public void setWorkExperience(int workExperience) { 33 | this.workExperience = workExperience; 34 | } 35 | 36 | public int getProjectNumber() { 37 | return projectNumber; 38 | } 39 | 40 | public void setProjectNumber(int projectNumber) { 41 | this.projectNumber = projectNumber; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/visitor/Interviewer.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.visitor; 2 | 3 | public interface Interviewer { 4 | void visit(Student student); 5 | void visit(Engineer engineer); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/visitor/LaborMarket.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.visitor; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class LaborMarket { 7 | 8 | List applicants = new ArrayList<>(); 9 | 10 | { 11 | applicants.add(new Student("Tamer", 3.2, "Computer Science")); 12 | applicants.add(new Student("Mohamed", 3.4, "Network Engineer")); 13 | applicants.add(new Student("Habiba", 3.4, "Computer Science")); 14 | applicants.add(new Engineer("Ahmed", 4, 15)); 15 | applicants.add(new Engineer("Mohand", 3, 10)); 16 | applicants.add(new Engineer("Mohab", 6, 20)); 17 | } 18 | 19 | 20 | public void showApplicants(Interviewer visitor) { 21 | for (Applicant applicant : applicants) { 22 | applicant.accept(visitor); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/visitor/Leader.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.visitor; 2 | 3 | public class Leader implements Interviewer { 4 | @Override 5 | public void visit(Student student) { 6 | System.out.println("Student " + student.getName() + "'s gpa is " + student.getGpa()); 7 | } 8 | 9 | @Override 10 | public void visit(Engineer engineer) { 11 | System.out.println("Engineer " + engineer.getName() + "'s number of projects is " + engineer.getProjectNumber()); 12 | } 13 | } -------------------------------------------------------------------------------- /src/com/company/Behavioraldesignpatterns/visitor/Student.java: -------------------------------------------------------------------------------- 1 | package com.company.Behavioraldesignpatterns.visitor; 2 | 3 | public class Student implements Applicant{ 4 | private String name; 5 | private double gpa; 6 | private String major; 7 | 8 | public Student(String name, double gpa, String major) { 9 | this.name = name; 10 | this.gpa = gpa; 11 | this.major = major; 12 | } 13 | 14 | @Override 15 | public void accept(Interviewer visitor) { 16 | visitor.visit(this); 17 | } 18 | 19 | public String getName() { 20 | return name; 21 | } 22 | 23 | public void setName(String name) { 24 | this.name = name; 25 | } 26 | 27 | 28 | public double getGpa() { 29 | return gpa; 30 | } 31 | 32 | public void setGpa(double gpa) { 33 | this.gpa = gpa; 34 | } 35 | 36 | public String getMajor() { 37 | return major; 38 | } 39 | 40 | public void setMajor(String major) { 41 | this.major = major; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/com/company/Creationaldesignpattern/Prototype/WordDocument.java: -------------------------------------------------------------------------------- 1 | package com.company.Creationaldesignpattern.Prototype; 2 | 3 | import java.util.ArrayList; 4 | 5 | public class WordDocument implements Cloneable { 6 | private String text; 7 | private ArrayList images = new ArrayList<>(); 8 | 9 | public WordDocument() { 10 | System.out.println("-----Init-----"); 11 | } 12 | 13 | public String getText() { 14 | return text; 15 | } 16 | 17 | public void setText(String text) { 18 | this.text = text; 19 | } 20 | 21 | public ArrayList getImages() { 22 | return images; 23 | } 24 | 25 | public void setImages(ArrayList images) { 26 | this.images = images; 27 | } 28 | 29 | public void addImage(String image) { 30 | images.add(image); 31 | } 32 | 33 | public void showDocument() { 34 | System.out.println("-----Start-----"); 35 | System.out.println("Text : " + text); 36 | System.out.println("Image List : "); 37 | for (String mImage : images) { 38 | System.out.println("Image Name : " + mImage); 39 | } 40 | System.out.println("-----End-----"); 41 | } 42 | 43 | protected WordDocument clone() { 44 | try { 45 | WordDocument copy = (WordDocument) super.clone(); 46 | copy.text = this.text; 47 | // copy.images = this.images; 48 | copy.images = (ArrayList) this.images.clone(); 49 | return copy; 50 | } catch (CloneNotSupportedException e) { 51 | e.printStackTrace(); 52 | } 53 | return null; 54 | } 55 | 56 | 57 | public static void main(String[] args) { 58 | WordDocument originDoc = new WordDocument(); 59 | originDoc.setText("This is a document"); 60 | originDoc.addImage("Image 1"); 61 | originDoc.addImage("Image 2"); 62 | originDoc.addImage("Image 3"); 63 | originDoc.showDocument(); 64 | WordDocument copyDoc = originDoc.clone(); 65 | copyDoc.showDocument(); 66 | copyDoc.setText("This is a copy document"); 67 | // add this line to test the origin document what will happen after the copy document add a image 68 | copyDoc.addImage("a new Image"); 69 | copyDoc.showDocument(); 70 | copyDoc.showDocument(); 71 | } 72 | 73 | } 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /src/com/company/Creationaldesignpattern/abstractfactory/CakeCream.java: -------------------------------------------------------------------------------- 1 | package com.company.Creationaldesignpattern.abstractfactory; 2 | 3 | public abstract class CakeCream { 4 | public abstract void cream(); 5 | } 6 | -------------------------------------------------------------------------------- /src/com/company/Creationaldesignpattern/abstractfactory/CakeFactory.java: -------------------------------------------------------------------------------- 1 | package com.company.Creationaldesignpattern.abstractfactory; 2 | 3 | public abstract class CakeFactory { 4 | public abstract CakeCream cream(); 5 | public abstract CakeStyle style(); 6 | } 7 | -------------------------------------------------------------------------------- /src/com/company/Creationaldesignpattern/abstractfactory/CakeStyle.java: -------------------------------------------------------------------------------- 1 | package com.company.Creationaldesignpattern.abstractfactory; 2 | 3 | public abstract class CakeStyle { 4 | public abstract void style(); 5 | } 6 | -------------------------------------------------------------------------------- /src/com/company/Creationaldesignpattern/abstractfactory/Client.java: -------------------------------------------------------------------------------- 1 | package com.company.Creationaldesignpattern.abstractfactory; 2 | 3 | public class Client { 4 | public static void main(String[] args) { 5 | CakeFactory mangoHeartCake = new MangoHeartCake(); 6 | mangoHeartCake.cream().cream(); 7 | mangoHeartCake.style().style(); 8 | 9 | System.out.println("================="); 10 | 11 | CakeFactory mangoSquareCake = new MangoSquareCake(); 12 | mangoSquareCake.cream().cream(); 13 | mangoSquareCake.style().style(); 14 | 15 | 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/com/company/Creationaldesignpattern/abstractfactory/HeartStyle.java: -------------------------------------------------------------------------------- 1 | package com.company.Creationaldesignpattern.abstractfactory; 2 | 3 | public class HeartStyle extends CakeStyle{ 4 | @Override 5 | public void style() { 6 | System.out.println("Heart Style"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/com/company/Creationaldesignpattern/abstractfactory/MangoCream.java: -------------------------------------------------------------------------------- 1 | package com.company.Creationaldesignpattern.abstractfactory; 2 | 3 | public class MangoCream extends CakeCream{ 4 | @Override 5 | public void cream() { 6 | System.out.println("Mango Cream"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/com/company/Creationaldesignpattern/abstractfactory/MangoHeartCake.java: -------------------------------------------------------------------------------- 1 | package com.company.Creationaldesignpattern.abstractfactory; 2 | 3 | public class MangoHeartCake extends CakeFactory{ 4 | @Override 5 | public CakeCream cream() { 6 | return new MangoCream() ; 7 | } 8 | 9 | @Override 10 | public CakeStyle style() { 11 | return new HeartStyle(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/company/Creationaldesignpattern/abstractfactory/MangoSquareCake.java: -------------------------------------------------------------------------------- 1 | package com.company.Creationaldesignpattern.abstractfactory; 2 | 3 | public class MangoSquareCake extends CakeFactory{ 4 | @Override 5 | public CakeCream cream() { 6 | return new MangoCream(); 7 | } 8 | 9 | @Override 10 | public CakeStyle style() { 11 | return new SquareStyle(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/company/Creationaldesignpattern/abstractfactory/SquareStyle.java: -------------------------------------------------------------------------------- 1 | package com.company.Creationaldesignpattern.abstractfactory; 2 | 3 | public class SquareStyle extends CakeStyle{ 4 | @Override 5 | public void style() { 6 | System.out.println("Square Style"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/com/company/Creationaldesignpattern/builder/Builder.java: -------------------------------------------------------------------------------- 1 | package com.company.Creationaldesignpattern.builder; 2 | 3 | public interface Builder { 4 | void builderColor(String color); 5 | 6 | void builderLicensePlate(String licensePlate); 7 | 8 | void builderBrand(String brand); 9 | 10 | Car build(); 11 | } 12 | -------------------------------------------------------------------------------- /src/com/company/Creationaldesignpattern/builder/Car.java: -------------------------------------------------------------------------------- 1 | package com.company.Creationaldesignpattern.builder; 2 | 3 | public class Car { 4 | private String color; 5 | private String licensePlate; 6 | private String brand; 7 | 8 | public void setColor(String color) { 9 | this.color = color; 10 | } 11 | 12 | public void setLicensePlate(String licensePlate) { 13 | this.licensePlate = licensePlate; 14 | } 15 | 16 | public void setBrand(String brand) { 17 | this.brand = brand; 18 | } 19 | 20 | @Override 21 | public String toString() { 22 | return "Car{" + 23 | "color='" + color + '\'' + 24 | ", licensePlate='" + licensePlate + '\'' + 25 | ", brand='" + brand + '\'' + 26 | '}'; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/com/company/Creationaldesignpattern/builder/CarBuilder.java: -------------------------------------------------------------------------------- 1 | package com.company.Creationaldesignpattern.builder; 2 | 3 | public class CarBuilder implements Builder { 4 | 5 | Car car; 6 | 7 | public CarBuilder() { 8 | car = new Car(); 9 | } 10 | 11 | @Override 12 | public void builderColor(String color) { 13 | car.setColor(color); 14 | } 15 | 16 | @Override 17 | public void builderLicensePlate(String licensePlate) { 18 | car.setLicensePlate(licensePlate); 19 | } 20 | 21 | @Override 22 | public void builderBrand(String brand) { 23 | car.setBrand(brand); 24 | } 25 | 26 | @Override 27 | public Car build() { 28 | return car; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/com/company/Creationaldesignpattern/builder/Client.java: -------------------------------------------------------------------------------- 1 | package com.company.Creationaldesignpattern.builder; 2 | 3 | public class Client { 4 | public static void main(String[] args) { 5 | Builder builder = new CarBuilder(); 6 | Director director = new Director(builder); 7 | director.construct("Red","A88888","Ferrari"); 8 | System.out.println(builder.build().toString()); 9 | 10 | 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/com/company/Creationaldesignpattern/builder/Director.java: -------------------------------------------------------------------------------- 1 | package com.company.Creationaldesignpattern.builder; 2 | 3 | public class Director { 4 | 5 | Builder builder; 6 | 7 | public Director(Builder builder) { 8 | this.builder = builder; 9 | } 10 | 11 | 12 | public void construct(String color, String licensePlate, String brand) { 13 | builder.builderColor(color); 14 | builder.builderLicensePlate(licensePlate); 15 | builder.builderBrand(brand); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/com/company/Creationaldesignpattern/factory/Cake.java: -------------------------------------------------------------------------------- 1 | package com.company.Creationaldesignpattern.factory; 2 | 3 | public interface Cake { 4 | void prepareMaterials(); 5 | 6 | void baking(); 7 | } 8 | -------------------------------------------------------------------------------- /src/com/company/Creationaldesignpattern/factory/CakeFactory.java: -------------------------------------------------------------------------------- 1 | package com.company.Creationaldesignpattern.factory; 2 | 3 | public class CakeFactory extends Factory{ 4 | 5 | @Override 6 | public T createProduct(Class clz) { 7 | Cake cake = null; 8 | try { 9 | cake = (Cake) Class.forName(clz.getName()).getDeclaredConstructor().newInstance(); 10 | }catch (Exception e) { 11 | e.printStackTrace(); 12 | } 13 | return (T) cake; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/com/company/Creationaldesignpattern/factory/Client.java: -------------------------------------------------------------------------------- 1 | package com.company.Creationaldesignpattern.factory; 2 | 3 | public class Client { 4 | public static void main(String[] args) { 5 | Factory factory = new CakeFactory(); 6 | MangoCake mangoCake = factory.createProduct(MangoCake.class); 7 | mangoCake.prepareMaterials(); 8 | mangoCake.baking(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/com/company/Creationaldesignpattern/factory/Factory.java: -------------------------------------------------------------------------------- 1 | package com.company.Creationaldesignpattern.factory; 2 | 3 | public abstract class Factory { 4 | public abstract T createProduct(Class clz); 5 | } 6 | -------------------------------------------------------------------------------- /src/com/company/Creationaldesignpattern/factory/MangoCake.java: -------------------------------------------------------------------------------- 1 | package com.company.Creationaldesignpattern.factory; 2 | 3 | public class MangoCake implements Cake{ 4 | @Override 5 | public void prepareMaterials() { 6 | System.out.println("prepare Mango Cream"); 7 | } 8 | 9 | @Override 10 | public void baking() { 11 | System.out.println("Baking ten minutes"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/company/Creationaldesignpattern/singleton/Counter.java: -------------------------------------------------------------------------------- 1 | package com.company.Creationaldesignpattern.singleton; 2 | 3 | public class Counter { 4 | 5 | public int count = 0; 6 | 7 | private static Counter instance = new Counter(); 8 | 9 | private Counter() { 10 | } 11 | 12 | public static Counter getInstance() { 13 | return instance; 14 | } 15 | 16 | public void addOne() { 17 | count++; 18 | } 19 | 20 | 21 | public static void main(String[] args) { 22 | 23 | Counter obj1 = Counter.getInstance(); 24 | Counter obj2 = Counter.getInstance(); 25 | obj1.addOne(); 26 | obj2.addOne(); 27 | System.out.println("Counter 1 : " + obj1.count); 28 | System.out.println("Counter 2 : " + obj2.count); 29 | 30 | obj1.addOne(); 31 | obj2.addOne(); 32 | System.out.println("Counter 1 : " + obj1.count); 33 | System.out.println("Counter 2 : " + obj2.count); 34 | 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/adapter/Client.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.adapter; 2 | 3 | public class Client { 4 | public static void main(String[] args) { 5 | Volt220 volt220 = new Volt220(); 6 | VoltAdapter adapter = new VoltAdapter(volt220); 7 | 8 | int volt = adapter.provideVoltFive(); 9 | System.out.println("After adapter, the volt is :" + volt); 10 | 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/adapter/Volt220.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.adapter; 2 | 3 | public class Volt220 { 4 | public int provideVolt220(){ 5 | return 220; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/adapter/VoltAdapter.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.adapter; 2 | 3 | public class VoltAdapter implements VoltFive{ 4 | 5 | private Volt220 volt220; 6 | 7 | public VoltAdapter(Volt220 volt220) { 8 | this.volt220 = volt220; 9 | } 10 | 11 | @Override 12 | public int provideVoltFive() { 13 | int volt = volt220.provideVolt220(); 14 | return 5; 15 | } 16 | 17 | public int provideVolt220() { 18 | return volt220.provideVolt220(); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/adapter/VoltFive.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.adapter; 2 | 3 | public interface VoltFive { 4 | int provideVoltFive(); 5 | } 6 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/decorator/Cake.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.decorator; 2 | 3 | public interface Cake { 4 | 5 | void make(); 6 | } 7 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/decorator/CakeEmbryo.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.decorator; 2 | 3 | public class CakeEmbryo implements Cake{ 4 | @Override 5 | public void make() { 6 | System.out.println("Baking Cake"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/decorator/DecoratorCake.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.decorator; 2 | 3 | public abstract class DecoratorCake implements Cake { 4 | Cake cake; 5 | 6 | public DecoratorCake(Cake cake) { 7 | this.cake = cake; 8 | } 9 | 10 | @Override 11 | public void make() { 12 | cake.make(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/decorator/FruitCake.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.decorator; 2 | 3 | public class FruitCake extends DecoratorCake{ 4 | 5 | public FruitCake(Cake cake) { 6 | super(cake); 7 | } 8 | 9 | @Override 10 | public void make() { 11 | addSomeFruit(); 12 | super.make(); 13 | } 14 | 15 | private void addSomeFruit(){ 16 | System.out.println("Add Some fruit"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/decorator/client.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.decorator; 2 | 3 | public class client { 4 | public static void main(String[] args) { 5 | Cake cake = new CakeEmbryo(); 6 | cake.make(); 7 | 8 | System.out.println("--------Decorate Fruit Cake--------"); 9 | DecoratorCake fruitCake = new FruitCake(cake); 10 | fruitCake.make(); 11 | 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/facade/Client.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.facade; 2 | 3 | public class Client { 4 | public static void main(String[] args) { 5 | Menu menu = new Menu(); 6 | 7 | System.out.println("Customer order"); 8 | menu.lasagneWithTomatoAndCheese(); 9 | menu.creamCaramel(); 10 | 11 | System.out.println("===========New Order=========="); 12 | System.out.println("Customer two orders"); 13 | menu.bouillabaisse(); 14 | menu.prawnRisotto(); 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/facade/Frenchkitchen.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.facade; 2 | 3 | public interface Frenchkitchen { 4 | 5 | void bouillabaisse(); 6 | 7 | void cassoulet(); 8 | 9 | void pouleAuPot(); 10 | } 11 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/facade/FrenchkitchenImpl.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.facade; 2 | 3 | public class FrenchkitchenImpl implements Frenchkitchen{ 4 | @Override 5 | public void bouillabaisse() { 6 | System.out.println("Bouillabaisse"); 7 | } 8 | 9 | @Override 10 | public void cassoulet() { 11 | System.out.println("Cassoulet"); 12 | } 13 | 14 | @Override 15 | public void pouleAuPot() { 16 | System.out.println("PouleAuPot"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/facade/Italykitchen.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.facade; 2 | 3 | public interface Italykitchen { 4 | 5 | void lasagneWithTomatoAndCheese(); 6 | 7 | void prawnRisotto(); 8 | 9 | void creamCaramel(); 10 | 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/facade/ItalykitchenImpl.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.facade; 2 | 3 | public class ItalykitchenImpl implements Italykitchen{ 4 | @Override 5 | public void lasagneWithTomatoAndCheese() { 6 | System.out.println("Lasagne With Tomato And Cheese"); 7 | } 8 | 9 | @Override 10 | public void prawnRisotto() { 11 | System.out.println("Prawn Risotto"); 12 | } 13 | 14 | @Override 15 | public void creamCaramel() { 16 | System.out.println("Cream Caramel"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/facade/Menu.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.facade; 2 | 3 | public class Menu { 4 | private Italykitchen italykitchen; 5 | private Frenchkitchen frenchkitchen; 6 | 7 | public Menu() { 8 | italykitchen = new ItalykitchenImpl(); 9 | frenchkitchen = new FrenchkitchenImpl(); 10 | } 11 | 12 | 13 | public void bouillabaisse() { 14 | frenchkitchen.bouillabaisse(); 15 | } 16 | 17 | public void cassoulet() { 18 | frenchkitchen.cassoulet(); 19 | } 20 | 21 | public void pouleAuPot() { 22 | frenchkitchen.pouleAuPot(); 23 | } 24 | 25 | public void lasagneWithTomatoAndCheese() { 26 | italykitchen.lasagneWithTomatoAndCheese(); 27 | } 28 | 29 | public void prawnRisotto() { 30 | italykitchen.prawnRisotto(); 31 | } 32 | 33 | public void creamCaramel() { 34 | italykitchen.creamCaramel(); 35 | } 36 | 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/flyweight/Client.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.flyweight; 2 | 3 | public class Client { 4 | public static void main(String[] args) { 5 | MovieTicket movieTicket1 = (MovieTicket) TicketFactory.getTicket("Transformers 5"); 6 | movieTicket1.printTicket("14:00-16:30", "Seat D-5"); 7 | MovieTicket movieTicket2 = (MovieTicket) TicketFactory.getTicket("Transformers 5"); 8 | movieTicket2.printTicket("14:00-16:30", "Seat F-6"); 9 | MovieTicket movieTicket3 = (MovieTicket) TicketFactory.getTicket("Transformers 5"); 10 | movieTicket3.printTicket("18:00-22:30", "Seat A-2"); 11 | 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/flyweight/MovieTicket.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.flyweight; 2 | 3 | import java.util.Random; 4 | 5 | public class MovieTicket implements Ticket { 6 | 7 | private String movieName; 8 | private String price; 9 | 10 | public MovieTicket(String movieName){ 11 | this.movieName = movieName; 12 | price = "Price " + new Random().nextInt(100); 13 | } 14 | 15 | @Override 16 | 17 | public void printTicket(String time, String seat) { 18 | System.out.println("+-------------------+"); 19 | System.out.printf("| %-12s |\n", movieName); 20 | System.out.println("| |"); 21 | System.out.printf("| %-12s|\n", time); 22 | System.out.printf("| %-12s|\n", seat); 23 | System.out.printf("| %-12s|\n", price); 24 | System.out.println("| |"); 25 | System.out.println("+-------------------+"); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/flyweight/Ticket.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.flyweight; 2 | 3 | public interface Ticket { 4 | public void printTicket(String time, String seat); 5 | } 6 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/flyweight/TicketFactory.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.flyweight; 2 | 3 | import java.util.Map; 4 | import java.util.concurrent.ConcurrentHashMap; 5 | 6 | public class TicketFactory { 7 | 8 | private static Map map = new ConcurrentHashMap<>(); 9 | 10 | public static Ticket getTicket(String movieName) { 11 | if (map.containsKey(movieName)) { 12 | return map.get(movieName); 13 | } else { 14 | Ticket ticket = new MovieTicket(movieName); 15 | map.put(movieName, ticket); 16 | return ticket; 17 | } 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/proxy/Client.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.proxy; 2 | 3 | public class Client { 4 | public static void main(String[] args) { 5 | IPicker picker = new RealPicker(); 6 | ProxyPicker proxyPicker = new ProxyPicker(picker); 7 | 8 | proxyPicker.receiveMessage(); 9 | proxyPicker.takeCourier(); 10 | proxyPicker.signatureAcceptance(); 11 | 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/proxy/IPicker.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.proxy; 2 | 3 | public interface IPicker { 4 | void receiveMessage(); 5 | 6 | void takeCourier(); 7 | 8 | void signatureAcceptance(); 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/proxy/ProxyPicker.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.proxy; 2 | 3 | public class ProxyPicker implements IPicker { 4 | 5 | private IPicker picker; 6 | 7 | public ProxyPicker(IPicker picker) { 8 | this.picker = picker; 9 | } 10 | 11 | @Override 12 | public void receiveMessage() { 13 | picker.receiveMessage(); 14 | } 15 | 16 | @Override 17 | public void takeCourier() { 18 | picker.takeCourier(); 19 | } 20 | 21 | @Override 22 | public void signatureAcceptance() { 23 | picker.signatureAcceptance(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/com/company/Structuraldesignpatterns/proxy/RealPicker.java: -------------------------------------------------------------------------------- 1 | package com.company.Structuraldesignpatterns.proxy; 2 | 3 | public class RealPicker implements IPicker{ 4 | @Override 5 | public void receiveMessage() { 6 | System.out.println("Receive text Message"); 7 | } 8 | 9 | @Override 10 | public void takeCourier() { 11 | System.out.println("Take the Courier"); 12 | } 13 | 14 | @Override 15 | public void signatureAcceptance() { 16 | System.out.println("Signature Acceptance"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /untitled104.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | --------------------------------------------------------------------------------